4.3.2 字符数组的输入输出
要完成例4-5还需要输入和输出字符数组。
字符数组的输入输出有以下两种方式:
一种是像一般数组一样,一个一个元素地依次使用%c格式进行输入或输出,但使用起来很不方便。
另一种通常是将整个字符数组作为一个整体来进行的,为此要使用scanf函数和printf函数的%s格式。此外,C语言还提供了gets和puts两个函数,可以更方便地进行字符串的输入和输出。
1. 使用scanf函数和gets函数输入字符串
要使用scanf函数输入字符串,需要在scanf的格式字符串中使用%s参数,比如
scanf("%s",word);
用于从键盘输入一个字符串,存储到word数组中,该字符串从第一个非空白的字符开始,到字符串遇到的第一个空白字符(空格、制表符或换行符)为止,系统自动为这个字符串加上'\0'结束标志。
当然,也可以一次输入多个字符串,比如
scanf("%s%s",word,word1);
用于从键盘输入两个字符串,分别存储到word和word1数组中,这两个字符串之间用空白字符分隔。
另外,也可以用gets函数来输入一个字符串,其一般形式为:
gets(字符数组名);
作用是从终端输入一个字符串到字符数组,比如
gets(word);
用于从键盘输入一个字符串,存储到word数组中,该字符串由换行符以前的所有字符组成,系统也会自动为这个字符串加上'\0'结束标志。
注意:
(1)在使用scanf和gets函数输入字符串时,都只需要直接给出相应的字符数组名即可,不需像输入普通变量那样,使用&这个取地址的运算符。这是因为,在C语言中,数组名代表这个数组的首地址,因此,在这两个函数中,使用&word这样的方式是错误的,比如,下面的语句就是错误的。
scanf("%s",&word);
gets(&word);
(2)输入字符串前,必须先定义字符数组,且字符数组的长度必须大于要输入的字符串的长度;否则,会出现字符数组越界,在运行时出现不可预知的错误,而编译系统则不会报告,比如:
char word[]="abcdef";
scanf("%s",word);
如果输入为abcdefg,则运行时有可能出现如图4.3.4所示的错误,当然其中的内存地址与所使用的计算机的当前状态有关。
图4.3.4 字符串输入出错信息
这是因为前面在定义word数组时,C分配word的长度为6,而输入的字符串的字符数为6,因此要存储这个字符串需要的数组长度为7,这样就会发生错误。
(3)要注意scanf函数和gets函数在读取字符串时的区别。由scanf函数读取字符串的功能知,用scanf函数读取的字符串中是不包含空白字符的,因为它会忽略开始的空白字符,以后当再次读取到空白字符时,就会结束读取。而gets函数所读取的字符串则可以包含空格。在使用时,要根据程序的功能进行合适的选择。
比如:
char word[10];
scanf("%s",word);
如果在键盘上输入abcd def,则word的值为"abcd"。而
char word[10];
gets(word);
如果在键盘上输入abcd def,则word的值为"abcd def"
2.使用printf函数和puts函数输出字符串
使用printf函数输出字符串,也需要使用%s格式,例如:
printf("%s",word);
将字符数组word以字符串的形式输出。输出时,第一次遇到结束标记'\0'就停止输出,而不管其后还有没有别的字符。
当然也可以一次输出多个字符串,例如:
char word[]="abc",word1[]="def";
printf("%s%s",word,word1);
的输出结果为abcdef
另外,也可以使用puts函数来输出一个字符串,其格式为:
puts(字符数组名)
其作用是将一个字符串输出到终端,并在输出时将字符串结束标记'\0'转换成'\n',即输出完字符串后换行,如
char word[]="abc",word1[]="def";
puts(word); puts(word1);
的输出结果为:
abc
def
注意:
在使用printf函数输出字符数组的值时,字符数组必须以'\0'结束,否则可能会显示很多乱字符。这是因为C语言在用printf的%s格式输出字符数组的值时,系统会从字符数组的第一个元素开始依次输出字符,直到遇到终止字符'\0',才会结束输出。
对于没有使用'\0'结束的字符数组,要想正确输出,必须像其他类型的一维数组一样,使用循环依次输出其各个数组元素。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。