C語言中沒有String這種類型。其實(shí)字符串就是字符序列,由多個(gè)字符組成算利,所以在C語言中,我們可以用字符數(shù)組來存儲(chǔ)字符串
泳姐。
- 字符串可以看做是一個(gè)特殊的字符數(shù)組效拭,為了跟普通的字符數(shù)組區(qū)分開來,應(yīng)該在字符串的尾部添加了一個(gè)結(jié)束標(biāo)志'\0'胖秒。'\0'是一個(gè)ASCII碼值為0的字符缎患,是一個(gè)空操作符,表示什么也不干阎肝。所以采用字符數(shù)組存放字符串挤渔,賦值時(shí)應(yīng)包含結(jié)束標(biāo)志'\0'。
字符串的初始化
char s[] = {'D', 'X', '\0'};
char s[3] = {'D', 'X', '\0'};//如果是字符串风题,不加上后面的 \0判导,有可能造成內(nèi)存溢出
char s[] = "DX"; //體統(tǒng)會(huì)自動(dòng)在后面補(bǔ)上 \0
char s[3] = "DX";
char s[3];
s[0] = 'D';
s[1] = 'X';
s[2] = '\0';
char [20] = "DX";
字符串的輸出
- printf
char a[] = {'D','X','\0'};
printf("輸出a----%5s\n",a);
上面的%5s\n
中 5 代表的是給出5個(gè)字節(jié)的空間來打印字符串a(chǎn),比如上面字符串a(chǎn)占3個(gè)字節(jié)俯邓,你給出了5個(gè)字節(jié)的空間骡楼,多了2個(gè),打印的出來字符串就會(huì)右對(duì)齊稽鞭。多余的字節(jié)空間就會(huì)被空格代替鸟整。\n
代表換行
輸出a---- DX
如果你把5變成-5,那就會(huì)左對(duì)齊
輸出a----DX Program ended with exit code: 0
- puts
puts要注意的是puts函數(shù)一次只能輸出一個(gè)字符串朦蕴,printf函數(shù)則可以同時(shí)輸出多個(gè)字符串
puts函數(shù)輸出一個(gè)字符串后會(huì)自動(dòng)換行篮条。
字符串后面少了\0的情況
- 我們來看一個(gè)例子
char a[] = {'D','X','\0'};//添加了 \0
char b[] = {'K','Y'};//沒有添加 \0
printf("輸出a----%s\n",a);
printf("輸出b----%s\n",b);
//下面的是輸出的結(jié)果
輸出a----DX
輸出b----KYDX
字符數(shù)組a和字符數(shù)組b在內(nèi)存的排列位置是按照代碼順序弟头,先從下往上開始排,就如上面的代碼先從b開始的涉茧,然后才是a赴恨。可以看下面的圖比較直觀(地址我是隨便寫的伴栓,只是為了直觀)
屏幕快照.png
printf函數(shù)很傻的伦连,它只會(huì)從你想輸出的字符數(shù)組第一個(gè)開始,直到'\0'結(jié)束钳垮。所以上面字符數(shù)組b沒有包含'\0',那就會(huì)繼續(xù)輸出惑淳,把字符數(shù)組a的內(nèi)容也輸出來了。所以切忌不要忘了寫上
'\0'
饺窿。如果地址中字符數(shù)組b排在a的后面呢歧焦?那你輸出字符數(shù)組b的時(shí)候,由于后面找不到結(jié)束的'\0'肚医,那系統(tǒng)就會(huì)自動(dòng)幫你補(bǔ)上一些亂七八糟的東西(運(yùn)氣好也有可能不補(bǔ)上绢馍,直接輸出你想要的內(nèi)容)
字符串的輸入
- scanf
char a[10];
scanf("%s", a);
scanf函數(shù)會(huì)從a的首地址開始存放用戶輸入的字符,存放完畢后肠套,系統(tǒng)會(huì)自動(dòng)在尾部加上一個(gè)結(jié)束標(biāo)記\0
注意舰涌,不要寫成scanf("%s", &a),因?yàn)閍已經(jīng)代表了數(shù)組的地址你稚,沒必要再加上&這個(gè)地址運(yùn)算符舵稠。
- gets
char a[10];
gets(a);
gets跟scanf一樣,會(huì)從a的首地址開始存放用戶輸入的字符入宦,存放完畢后哺徊,系統(tǒng)會(huì)自動(dòng)在尾部加上一個(gè)結(jié)束標(biāo)記\0。
- gets一次只能讀取一個(gè)字符串乾闰,scanf則可以同時(shí)讀取多個(gè)字符串
- gets可以讀入包含空格落追、tab的字符串,直到遇到回車為止涯肩;scanf不能用來讀取空格轿钠、tab