字符數組就是char數組,當維度是一維是可以當做“字符串”,當維度是二維時可以當成是字符串數組,即若干字符串。字符數組的輸入除了使用scanf外,還可以使用getchar或者gets;其輸出除了使用printf外,還可以使用putchar或者puts。
(1)scanf輸入,printf輸出
scanf對字符串的輸入有%s和%c兩種格式。%c格式用來輸入單個字符,它能夠識別空格和換行符並將其保存到字符數組中;%s格式用來輸入一個字符串,它通過空格和換行來識別一個字符串的結束。也就是說使用%s格式輸入並保存到字符數組中的字符串是不含空格的。下面是一個實例:
- <span style=“font-size:18px;”>#include <stdio.h>
- int main(){
- char str[10];
- scanf(”%s”, str);
- printf(”%s”, str);
- return 0;
- }</span>
#include <stdio.h>
int main(){
char str[10];
scanf("%s", str);
printf("%s", str);
return 0;
}
輸入字符串“abc def ghi”,輸出的結果爲“abc”。可以看到,%s識別空格作爲字符串的結尾,因此第一個空格後面的字符都不會被讀入。
(2)getchar輸入,putchar輸出
getchar和putchar分別用來輸入和輸出單個字符。getchar可以識別換行符和空格並將其保存。下面是一個例子:
- <span style=“font-size:18px;”>#include <stdio.h>
- int main(){
- char c1, c2, c3;
- c1 = getchar();
- c2 = getchar();
- c3 = getchar();
- putchar(c1);
- putchar(c2);
- putchar(c3);
- return 0;
- }</span>
#include <stdio.h>
int main(){
char c1, c2, c3;
c1 = getchar();
c2 = getchar();
c3 = getchar();
putchar(c1);
putchar(c2);
putchar(c3);
return 0;
}
在這裏我們如果輸入“a“,然後敲回車,然後輸入”bc“,再敲回車,輸出的結果會是這樣:
a
b
這是由於getchar可以識別換行符,所以c2實際上存儲的是換行符,因此字符c沒有被存入,字符ab之間會有一個換行出現。
(3)gets輸入,puts輸出
gets用來輸入一行字符串並將其存放於一維數組(或二維數組的一維)中,讀取字符串直到換行符結束,但換行符會被丟棄,然後再末尾添加‘\0’,它與scanf(”%s“, s)相似,但不完全相同,gets可識別空格並將其輸入。puts函數會自動換行。下面是一個例子:
- <span style=“font-size:18px;”>#include <stdio.h>
- int main(){
- char str1[20];
- char str2[5][10];
- gets(str1);
- for(int i = 0; i < 3; i ++){
- gets(str2[i]);
- }
- puts(str1);
- for(int i = 0; i < 3; i ++){
- puts(str2[i]);
- }
- return 0;
- }</span>
#include <stdio.h>
int main(){
char str1[20];
char str2[5][10];
gets(str1);
for(int i = 0; i < 3; i ++){
gets(str2[i]);
}
puts(str1);
for(int i = 0; i < 3; i ++){
puts(str2[i]);
}
return 0;
}
輸入下面幾個字符串:abc def
QAQ
T_T
WoAiNi
這幾個字符串都可以原樣輸出,因爲gets可以識別空格並將其保存到字符串中。另外需要注意的是,gets函數會無限讀取,不會判斷上限,所以程序員應該確保buffer的空間足夠大,以便在執行讀取操作時不會發生溢出。如果溢出,多出來的字符會被寫入到堆棧中,這就覆蓋了堆棧原有的內容,破壞一個或多個不相關變量的值。