先看下代码以及运行结果(这代码从网上拷的)
#include <stdio.h>
int main()
{
// 先读入一个整数,再读入2个串
int a;
char b1[100];
char b2[100];
scanf("%d", &a);
gets(b1);
gets(b2);
printf("a = %d\n", a);
printf("b1 = %s\n", b1);
printf("b2 = %s\n", b2);
return 0;
}
这是使用gets函数的运行结果:
改成scanf函数试试
scanf("%d", &a);
scanf("%s",b1);
scanf("%s",b2);
从两个运行结果来看,gets函数会读取换行符,但是读取了换行符了就不会读取后面的数据;记住,当我们输入回车键的时候其实是输入了换行回车两个字符进去的,记住是先输入回车字符后输入换行字符,但是gets函数并不接受回车字符,把它当作结束符,即遇到回车就读取之前的数据,那么后面的换行符并没有读取,这就导致后面使用的gets函数会读取到换行符,读取到了换行符就不会读取后面的字符,且把它转换为终止符。scanf函数就不会出现这种情况。
也就是说使用gets函数得注意输入换行符的问题,一般使用getchar接受换行符,有许多人可能为问到既然scanf不会出现这种问题为什么不使用scanf函数,这里有两个原因:
1使用gets函数更加简单对于字符串输入来说;
2scanf不能接受空格,sanf把空格当成结束符,一般遇到有空格的字符串得使用gets函数接受读取,gets函数可以接收有空格的字符串。
总而言之,使用C语言里的gets得注意换行符的接收,scanf函数不能接收带空格的字符串。