scanf()中清除输入缓冲区的几种方法归纳

应用场景:

我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种问题,

总的思想:通过各种方法将输入缓冲区的内容读出来.

方法一:

使用scanf(“%*[^\n]%*c”):成功;

解释:

1.这里的星号’*’表示读入某类型的内容,但是这个内容不保存到变量里,所以后面不需要对应的参量;

也就是说,只要我再%后面加入星号之后,后没可以不放置接收的变量.

2.scanf(“%*[^\n]%*c”)的%*[^\n]表示读入除了回车之外的字符以及读入一个字符后不保存,只有这样,才不会把我输入回车吸收,导致我不能退出程序.但是按照这种方法应该%*s应该也行,但是不行,具体不知道为啥.

3.[]内是只读入限定读入的字符,如:[abcd]指的是只读入abcd的字符

4.所以整行代码的解释是"%*[^\n]"首先读入缓冲区的剩余内容,%*c是读入最后一个没有读入的回车;这样就清空的输入缓冲区.

方法二:

使用fflush(stdin)不成功,估计和系统的机制有关,有人测试vc是ok的,但是xcode和linux系统下都不成功;

方法三:

使用getchar+while成功;

使用while(getBuff=getchar()!=‘\n’ && getBuff!=EOF),使用循环把缓冲区的读完,直到读到缓冲区的\n或者是空值;

方法四:

使用gets+预留最大值成功;

使用gets,创建一个数组,将缓冲区的内容读完;

方法三方法四都是使用流的方式,把剩余的东西一并读完,管他是不是\n,还是这个比较舒心

方法五:

rewind(stdin),这个在xcode可以,真是奇怪,rewind是移动指针到开头是可以,清空输入不可以,真是奇了怪了;

永不止步步 发表于01-06 13:57 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308317个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号