【C语言】关于scanf缓存区

问题引出

我们先来看看一段代码

    int main{
	int ret = 0;
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	printf("请确定(Y/N):>");
	ret = getchar();
	if (ret == 'Y') {
		printf("确认成功\n");
	}
	else {
		printf("放弃确认");
	}
}

判断以上代码会出现什么问题?
没错,当你输入密码后就会出现以下问题。
在这里插入图片描述
系统会直接跳到else{}语句中去.
那么这是为什么呢?
这里就要说说scanf的缓冲区了。

缓冲区

  • 缓冲区又被称为缓存,是内存空间的一部分,也就是说在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分存储空间就叫做缓冲区。

c语言中在读取键盘数据时,需要按回车键才能完成该行数据的输入确认。但是 scanf()函数不会读取回车键,也就是说当我们输入123456,然后回车,scanf只读到了回车键(\n)以前的内容,回车键会留在输入缓存区中。
因此,在下一个读“字符”操作函数getchar()运行时,会读到这个字符。这样就会出现以上问题,那么我们怎么去解决呢

解决办法

1.可以用fflush(stdin)命令强行刷新输入缓存。

printf("请确定(Y/N):>");
fflush(stdin);
ret = getchar();

2.可以用getchar()来吃掉前面的回车确认。注意:getchar()一次只能读取一个字符。

printf("请确定(Y/N):>");
getchar();
ret = getchar();

3.在scanf()书写上做文章,如:读一个数据,以回车确认,则输写成如下格式。

printf("请输入密码:>");
scanf("%s%*c", password);//%*c表示读取任意一个字符,但是不会赋值给任意变量
printf("请确定(Y/N):>");
ret = getchar();
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值