scanf缓冲区问题

我们先来看一段代码和其运行结果

当我们输入b的值并敲击回车键之后,并没有让我们输入c的值,造成这个现象的原因是因为scanf的输入缓冲区的问题

scanf读取的数据并不是直接从键盘读取,而是键盘输入的数据会先放到输入缓冲区中,然后scanf从缓冲区中读取数据 

1.输入10并敲击回车键之后输入缓冲区的内容如下 

2.由于是以%d的形式读取数据所以scanf会读取缓冲区中的数据10 ,scanf中%d读取数据时,%d只识别“十进制整数”。对于%d而言,空格、回车、Tab键都是区分数据与数据的分隔符。当scanf进入缓冲区读取数据的时候,如果%d遇到空格、回车、Tab键,那么它并不会采用,而是跳过取后面的数据,直到取到“十进制整数”为止。读取成功之后输入缓冲区的内容如下。

 3.输入20.0并敲击回车键之后输入缓冲区的内容如下 

4.scanf以%f的形式读取字符时遇到空格、回车、Tab键,也不会采用,而是跳过取后面的数据,对于被跳过和取出的数据,系统会将它从缓冲区中释放掉读取成功之后输入缓冲区的内容如下。

5.scanf以%c的形式读取时,并不会跳过任何字符,所以执行到这一步时,scanf会读取缓冲区中的\n,因此会出现上方执行效果。 读取之后输入缓冲区的内容如下。

如何解决该问题呢? 

由于getchar()也是从输入缓冲区读取数据,每次读取一个字符,所以我们可以使用getchar()这个函数把输入缓冲区的内容清空 ,添加下方蓝色框内的代码之后可以看到程序正常运行了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值