字符数组就是char数组,当维度是一维是可以当做“字符串”,当维度是二维时可以当成是字符串数组,即若干字符串。字符数组的输入除了使用scanf外,还可以使用getchar或者gets;其输出除了使用printf外,还可以使用putchar或者puts。
(1)scanf输入,printf输出
scanf对字符串的输入有%s和%c两种格式。%c格式用来输入单个字符,它能够识别空格和换行符并将其保存到字符数组中;%s格式用来输入一个字符串,它通过空格和换行来识别一个字符串的结束。也就是说使用%s格式输入并保存到字符数组中的字符串是不含空格的。下面是一个实例:
-
#include
-
int main(){
-
char str[
10];
-
scanf(
"%s", str);
-
printf(
"%s", str);
-
return
0;
-
}
输入字符串“abc def ghi”,输出的结果为“abc”。可以看到,%s识别空格作为字符串的结尾,因此第一个空格后面的字符都不会被读入。
(2)getchar输入,putchar输出
getchar和putchar分别用来输入和输出单个字符。getchar可以识别换行符和空格并将其保存。下面是一个例子:
-
#include
-
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函数会自动换行。下面是一个例子:
-
#include
-
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的空间足够大,以便在执行读取操作时不会发生溢出。如果溢出,多出来的字符会被写入到堆栈中,这就覆盖了堆栈原有的内容,破坏一个或多个不相关变量的值。