输入缓冲区究竟有啥秘密
2023-3-26 来源:不详 浏览次数:次白癜风擦什么药膏好 http://m.39.net/pf/a_4784989.html
小豆丁:老张!老张!江湖救急啊!
老张:咋啦,火急火燎的?
小豆丁:我写了个程序,我敢对天发誓,代码绝对没有问题,但是!运行结果就是和预期不一样,我不知道哪里出了问题!你快给我看看吧!
老张:把你代码给我瞧瞧!
小豆丁:就这个代码!你看!
老张:代码语法上确实没问题,是不是程序运行起来之后,给整数类型变量num赋值后还没来得及给字符类型变量ch赋值,程序就结束了?
小豆丁:嗯呐,是这样!
老张:产生这个问题的原因并不是源自于代码,而是和输入缓冲区有关。
小豆丁:啥是输入缓冲区啊?
老张:我们在程序中通过scanf函数,对变量进行赋值,数据的传递过程你还记得吧?
小豆丁:记得啊,通过标准输入设备也就是键盘进行数据的输入,然后传递到我们程序中的变量进行存储。
老张:其实这个过程并不全面,当从键盘获取数据后,并不是直接把数据存入程序中变量里的,而是经过了一个叫做输入缓冲区的地方。
小豆丁:输入缓冲区?
老张:键盘输入的数据先存放到输入缓冲区中,然后再从输入缓冲区里读取到程序的变量中。
小豆丁:那为啥经过过了这个缓冲区之后,我的程序就出问题了呢?
老张:我们来分析下这个过程,首先当你在给第一个整形变量num赋值的时候,你在键盘上都输入啥?
小豆丁:我想给变量num赋值18,所以我在键盘上敲了18这个数字啊!
老张:没有别的了吗?
小豆丁:没了啊,我只敲了18这个数字啊?
老张:那你输入18这个数字之后,你是不是还敲了回车键啊!
小豆丁:肯定的啊,不敲回车键,程序没办法继续运行啊。
老张:问题就在这,通过键盘放入输入缓冲区里的数据,不仅仅是你想要的18,还有你按下的回车!
小豆丁:回车也会放到输入缓冲区?它也不是个数字啊?
老张:没错,回车确实不是数字,但是当你敲击回车后,在输入缓冲区中会多存放一个\n字符,也就是我们平时所说的换行字符。
老张:之后,你的18从缓冲区被拿走,存储到程序中的整形变量num中,而\n字符却还留在输入缓冲区中。
小豆丁:哦,我好像明白了!因为缓冲区中还残留着这个\n字符,所以接下来该给字符类型变量ch赋值时,直接将缓冲区里的\n字符拿走赋值给字符变量ch了。是这个意思吗?
老张:没错,因为\n换行字符并不会被整数类型变量num所接收,所以它会留在缓冲区中,而接下来要被赋值的变量ch是字符类型的,刚好可以存储\n字符,所以还没等你通过键盘去赋值,\n字符就直接被拿到了ch变量中,程序也就结束了,也就意味着,变脸ch实际存储的是\n字符。
小豆丁:嗯嗯,我明白了,那这个问题该怎么解决呢?
老张:其实也简单,只要你把缓冲区里的\n换行字符清理到就行了呗。
小豆丁:怎么清理,快教教我。
老张:你可以在程序中添加这两行代码,完成输入缓冲区的清理工作。
小豆丁:哈哈,那我赶紧去试试,看这次结果是不是正常的!
老张:喜欢老张的文章的话,就