C語言中沒有String這種類型。其實字符串就是字符序列,由多個字符組成,所以在C語言中,我們可以用字符數組來存儲字符串
。
- 字符串可以看做是一個特殊的字符數組,為了跟普通的字符數組區分開來,應該在字符串的尾部添加了一個結束標志'\0'。'\0'是一個ASCII碼值為0的字符,是一個空操作符,表示什么也不干。所以采用字符數組存放字符串,賦值時應包含結束標志'\0'。
字符串的初始化
char s[] = {'D', 'X', '\0'};
char s[3] = {'D', 'X', '\0'};//如果是字符串,不加上后面的 \0,有可能造成內存溢出
char s[] = "DX"; //體統會自動在后面補上 \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個字節的空間來打印字符串a,比如上面字符串a占3個字節,你給出了5個字節的空間,多了2個,打印的出來字符串就會右對齊。多余的字節空間就會被空格代替。\n
代表換行
輸出a---- DX
如果你把5變成-5,那就會左對齊
輸出a----DX Program ended with exit code: 0
- puts
puts要注意的是puts函數一次只能輸出一個字符串,printf函數則可以同時輸出多個字符串
puts函數輸出一個字符串后會自動換行。
字符串后面少了\0的情況
- 我們來看一個例子
char a[] = {'D','X','\0'};//添加了 \0
char b[] = {'K','Y'};//沒有添加 \0
printf("輸出a----%s\n",a);
printf("輸出b----%s\n",b);
//下面的是輸出的結果
輸出a----DX
輸出b----KYDX
字符數組a和字符數組b在內存的排列位置是按照代碼順序,先從下往上開始排,就如上面的代碼先從b開始的,然后才是a。可以看下面的圖比較直觀(地址我是隨便寫的,只是為了直觀)
屏幕快照.png
printf函數很傻的,它只會從你想輸出的字符數組第一個開始,直到'\0'結束。所以上面字符數組b沒有包含'\0',那就會繼續輸出,把字符數組a的內容也輸出來了。所以切忌不要忘了寫上
'\0'
。如果地址中字符數組b排在a的后面呢?那你輸出字符數組b的時候,由于后面找不到結束的'\0',那系統就會自動幫你補上一些亂七八糟的東西(運氣好也有可能不補上,直接輸出你想要的內容)
字符串的輸入
- scanf
char a[10];
scanf("%s", a);
scanf函數會從a的首地址開始存放用戶輸入的字符,存放完畢后,系統會自動在尾部加上一個結束標記\0
注意,不要寫成scanf("%s", &a),因為a已經代表了數組的地址,沒必要再加上&這個地址運算符。
- gets
char a[10];
gets(a);
gets跟scanf一樣,會從a的首地址開始存放用戶輸入的字符,存放完畢后,系統會自動在尾部加上一個結束標記\0。
- gets一次只能讀取一個字符串,scanf則可以同時讀取多個字符串
- gets可以讀入包含空格、tab的字符串,直到遇到回車為止;scanf不能用來讀取空格、tab