C语言对于刷新刷冲区的理解

首先,我们先了解一下 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还有空了一行,所以这种情况下,就要加上清除缓冲区的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值