清理cin输入缓冲区_输入缓冲区究竟有啥秘密?

小豆丁:老张!老张!江湖救急啊!

老张:咋啦,火急火燎的?

小豆丁:我写了个程序,我敢对天发誓,代码绝对没有问题,但是!运行结果就是和预期不一样,我不知道哪里出了问题!你快给我看看吧!

老张:把你代码给我瞧瞧!

小豆丁:就这个代码!你看!

2e83da6abee7a27cbb0b891f69270ec4.png

老张:代码语法上确实没问题,是不是程序运行起来之后,给整数类型变量num赋值后还没来得及给字符类型变量ch赋值,程序就结束了?

小豆丁:嗯呐,是这样!

老张:产生这个问题的原因并不是源自于代码,而是和输入缓冲区有关。

小豆丁:啥是输入缓冲区啊?

老张:我们在程序中通过scanf函数,对变量进行赋值,数据的传递过程你还记得吧?

小豆丁:记得啊,通过标准输入设备也就是键盘进行数据的输入,然后传递到我们程序中的变量进行存储。

老张:其实这个过程并不全面,当从键盘获取数据后,并不是直接把数据存入程序中变量里的,而是经过了一个叫做输入缓冲区的地方。

小豆丁:输入缓冲区?

老张:键盘输入的数据先存放到输入缓冲区中,然后再从输入缓冲区里读取到程序的变量中。

小豆丁:那为啥经过过了这个缓冲区之后,我的程序就出问题了呢?

老张:我们来分析下这个过程,首先当你在给第一个整形变量num赋值的时候,你在键盘上都输入啥?

小豆丁:我想给变量num赋值18,所以我在键盘上敲了18这个数字啊!

老张:没有别的了吗?

小豆丁:没了啊,我只敲了18这个数字啊?

老张:那你输入18这个数字之后,你是不是还敲了回车键啊!

小豆丁:肯定的啊,不敲回车键,程序没办法继续运行啊。

老张:问题就在这,通过键盘放入输入缓冲区里的数据,不仅仅是你想要的18,还有你按下的回车!

小豆丁:回车也会放到输入缓冲区?它也不是个数字啊?

老张:没错,回车确实不是数字,但是当你敲击回车后,在输入缓冲区中会多存放一个''字符,也就是我们平时所说的换行字符。

老张:之后,你的18从缓冲区被拿走,存储到程序中的整形变量num中,而''字符却还留在输入缓冲区中。

小豆丁:哦,我好像明白了!因为缓冲区中还残留着这个''字符,所以接下来该给字符类型变量ch赋值时,直接将缓冲区里的''字符拿走赋值给字符变量ch了。是这个意思吗?

老张:没错,因为''换行字符并不会被整数类型变量num所接收,所以它会留在缓冲区中,而接下来要被赋值的变量ch是字符类型的,刚好可以存储''字符,所以还没等你通过键盘去赋值,''字符就直接被拿到了ch变量中,程序也就结束了,也就意味着,变脸ch实际存储的是''字符。

小豆丁:嗯嗯,我明白了,那这个问题该怎么解决呢?

老张:其实也简单,只要你把缓冲区里的''换行字符清理到就行了呗。

小豆丁:怎么清理,快教教我。

老张:你可以在程序中添加这两行代码,完成输入缓冲区的清理工作。

726a1e54ba1430b1a32f38a3acd61d98.png

小豆丁:哈哈,那我赶紧去试试,看这次结果是不是正常的!

老张:喜欢老张的文章的话,就关注我吧,每天分享一个小知识!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值