天天看点

C语言字符数组的输入输出处理

字符数组就是char数组,当维度是一维是可以当做“字符串”,当维度是二维时可以当成是字符串数组,即若干字符串。字符数组的输入除了使用scanf外,还可以使用getchar或者gets;其输出除了使用printf外,还可以使用putchar或者puts。

(1)scanf输入,printf输出

scanf对字符串的输入有%s和%c两种格式。%c格式用来输入单个字符,它能够识别空格和换行符并将其保存到字符数组中;%s格式用来输入一个字符串,它通过空格和换行来识别一个字符串的结束。也就是说使用%s格式输入并保存到字符数组中的字符串是不含空格的。下面是一个实例:

  1. #include <stdio.h>
  2. int main(){
  3. char str[ ];
  4. scanf( "%s", str);
  5. printf( "%s", str);
  6. return ;
  7. }

输入字符串“abc def ghi”,输出的结果为“abc”。可以看到,%s识别空格作为字符串的结尾,因此第一个空格后面的字符都不会被读入。

(2)getchar输入,putchar输出

getchar和putchar分别用来输入和输出单个字符。getchar可以识别换行符和空格并将其保存。下面是一个例子:

  1. #include <stdio.h>
  2. int main(){
  3. char c1, c2, c3;
  4. c1 = getchar();
  5. c2 = getchar();
  6. c3 = getchar();
  7. putchar(c1);
  8. putchar(c2);
  9. putchar(c3);
  10. return ;
  11. }

在这里我们如果输入“a“,然后敲回车,然后输入”bc“,再敲回车,输出的结果会是这样:

a

b

这是由于getchar可以识别换行符,所以c2实际上存储的是换行符,因此字符c没有被存入,字符ab之间会有一个换行出现。

(3)gets输入,puts输出

gets用来输入一行字符串并将其存放于一维数组(或二维数组的一维)中,读取字符串直到换行符结束,但换行符会被丢弃,然后再末尾添加‘\0’,它与scanf(”%s“, s)相似,但不完全相同,gets可识别空格并将其输入。puts函数会自动换行。下面是一个例子:

  1. #include <stdio.h>
  2. int main(){
  3. char str1[ ];
  4. char str2[ ][ ];
  5. gets(str1);
  6. for( int i = ; i < ; i ++){
  7. gets(str2[i]);
  8. }
  9. puts(str1);
  10. for( int i = ; i < ; i ++){
  11. puts(str2[i]);
  12. }
  13. return ;
  14. }

输入 下面几个字符串:

abc def

QAQ

T_T

WoAiNi

这几个字符串都可以原样输出,因为gets可以识别空格并将其保存到字符串中。另外需要注意的是,gets函数会无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读取操作时不会发生溢出。如果溢出,多出来的字符会被写入到堆栈中,这就覆盖了堆栈原有的内容,破坏一个或多个不相关变量的值。

继续阅读