问题代码如下:
#include<stdio.h>
main()
{char a1[5],a2[5],a3[5],a4[5];
scanf("%s%s",a1,a2);
gets(a3);gets(a4);
puts(a1);puts(a2);
puts(a3);puts(a4);
}
键盘输入:
aa bb<回车>
cc dd<回车>
问题:为何输出结果是:
aa
bb
cc dd
注意这点,gets()函数会读取一行字符,直到遇到换行符'\n为止,并且这个换行符不会读取到数组中。
scanf("%s%s",a1,a2);
这一行把aa和bb读取并分别保存到a1和a2数组中,但是会把回车符留在缓冲区中。
gets(a3);gets(a4);
这里的gets(a3)会读取这个回车符,但是不会把回车符保存到a3数组,所以a3数组内容不会改变,接下来的gets(a4)将以回车结尾的cc dd读取并保存到a4中
puts(a1);puts(a2);
分别在单独的行中输出a1和a2字符串。puts(a3);puts(a4);
分别在单独的行中输出a3和a4字符串。由于a3没有赋值,所以它依然保持在定义时的随机值。
解决方法:
方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
这个函数是fflush(stdin)。
(以下内容是我自己编辑的)
- scanf() 函数是遇到空白符就停止读入数据。空白符会被留在输入缓存区中。(cin和scanf一样)
- gets()遇到回车符停止读入数据。回车符会读入到字符数组中,但是,被保存为了 '\0'。
- 因此,当先用了scanf或者cin之后,再用gets的话,容易出错。因为之前没被scanf和cin读走的空白符还留在输入缓冲区中,而一旦调用gets,gets就会从输入缓冲区中读入这些数据。
- 这三种输入在被调用时都是直接从输入缓冲区中读取数值,不等键盘按下。
- 在键盘按下的字符都被保存在输入缓冲区之中。
有不明白的,欢迎在下方留言。