首先,我们先了解一下 gets 函数和 scanf 函数的异同点
相同点:gets 函数和 scanf 函数都可以作为字符串的输入函数,相同点都是将从键盘输入的字符串存入数组中,输入完成后要以回车来结束输入。
不同点:
1、使用 scanf 时,在输入过程中碰到空格时系统认为输入结束,并将空格之前的字符作为有效字符存入数组中,并在尾部追加\0 作为结束标志。利用 gets 时,空格符被看作是有效字符,也就是说只有碰到回车符时系统才认为输入结束。
2、gets() 可以读取空回车,但是 scanf() 不能
3、scanf 和 gets 对待缓冲区里的回车符也是完全不同的。scanf 在读取非空白符之前会忽略回车,读取之后如果遇到回车会停止输入,将其留着缓冲区里;gets 只要一遇到回车就输入结束,并把这个回车从缓冲区里移走。
有些时候,我们在使用scanf()语句时,输入字符串以后,敲一个回车符,想继续输入的时候,你会发现没办法输出了,下面有一个简单的例子
#include <stdio.h>
int main()
{
char a[25];
char b[25];
printf("请输入账号:");
scanf("%s",a );
printf("请输入密码:");
//getchar();
//fflush(stdin);
gets(b);
printf("%s\n",b );
return 0 ;
}
上面程序的运行结果:
当敲回车之后,密码是无法输入的,原因是因为当你输入账号时,scanf()语句碰到空格、tab键、enter键就会停止输入,然后scanf()函数输入的字符串后面会自动加一个"\0",现在缓冲区内有2634861458\0,当你敲回车符之后,2634861458\0就会从缓冲区中去掉,但是回车符还在缓冲区内,当缓冲区内不为空时,gets函数是不会等待的,然后回车符就会赋给b,所以是没有办法输入密码的。
解决的方法:无非就是把enter去掉
1、使用getchar();把回车符接收。
2、使用fflush(stdin);直接清除缓冲区。
建议使用第二种方法,可以把缓冲区的内容全部清除。
运行结果:
当然,你也可以使用下面的代码
#include <stdio.h>
int main()
{
char a[25] ;
char b[25] ;
printf("请输入账号:");
scanf("%s",a );
printf("请输入密码:");
scanf("%s",b);
printf("%s\n",a);
printf("%s\n",b);
return 0 ;
}
运行结果:
这是因为scanf()和gets()不同,在输入之前,scanf()会忽视缓冲区内的回车符。所以不需要清除缓冲区的操作。
但是,当输入字符的时候scanf()是需要刷新缓冲区的,下面看一个例子
#include <stdio.h>
int main()
{
char a;
char b;
printf("请输入一个字符:");
scanf("%c",&a ) ;
printf("请输入另一个字符:");
scanf("%c",&b) ;
printf("%c\n",a);
printf("%c\n",b);
return 0 ;
}
运行结果:
这是因为回车符被b接收了,所以输出a、b时会出现一个a还有空了一行,所以这种情况下,就要加上清除缓冲区的操作。