免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5225 | 回复: 5
打印 上一主题 下一主题

[C++] 刷新输入缓冲区 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-06 21:13 |只看该作者 |倒序浏览
初学C++,写了一段代码,本意想实现如下功能:
要求用户输入一个整数,打印其值,若用户输入错误的数据(比如输入字母),则打印一条出错信息,然后让用户重新输入。

代码如下:


现在的问题是:

若用户正确地输入整数,则没有任何问题;但是用户如果输入错误数据,比如输入字母'a',那么程序就会死循环打印出错信息“error,retry”,永远不会让用户进行第二次输入。而我的本意是只打印一次出错信息,然后等待用户第二次输入。

后来我想难道是cin输入缓冲区需要刷新?但到处找也没找到相关信息,于是死马当活马医,在cin.clear()语句后面加了一句cin.get(),结果就可以达到我的目的了,我不清楚的就是为什么会这样?希望大家能够帮我解释一下。难道是编译器的问题吗?

附修改后能正确运行的代码:



cout << "error,retry" << endl;
cin.clear();
cin.get();


论坛徽章:
0
2 [报告]
发表于 2008-10-06 21:50 |只看该作者
LZ你不能直接贴代码么?为什么要贴成图片?

论坛徽章:
0
3 [报告]
发表于 2008-10-06 21:52 |只看该作者
用ignore函数类似处理:

  1. while(1){
  2.         cout<<"Input x: ";
  3.         cin>>x;
  4.                
  5.         if (!cin) {
  6.                 cin.clear();
  7.                 cin.ignore(numeric_limits<int>::max(), '\n');
  8.                 continue;
  9.         }
  10.         //.....
  11. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2008-10-06 22:42 |只看该作者
你是水木 跑过来的吧???

论坛徽章:
0
5 [报告]
发表于 2008-10-06 22:56 |只看该作者
因为我是用的虚拟机写的代码,不知道如何输出文本,就直接抓图了。

原来还有ignore这个成员函数,我看的书上完全没讲啊,推荐一本比较详细地介绍I/O Stream的书吧。

不过我还是不太明白具体的原因啊。

难道cin是先读取streambuf中的字符,然后判断,如果正确,再移动streambuf的迭代器,如果不正确,就不移动streambuf的迭代器,这样下次cin的时候,依然读取streambuf中旧的字符。也就是用basic_streambuf::sgetc() ,而不是用basic_streambuf::sbumpc()吗?

论坛徽章:
0
6 [报告]
发表于 2008-10-06 23:40 |只看该作者
原帖由 kiffa 于 2008-10-6 22:56 发表
因为我是用的虚拟机写的代码,不知道如何输出文本,就直接抓图了。

原来还有ignore这个成员函数,我看的书上完全没讲啊,推荐一本比较详细地介绍I/O Stream的书吧。

不过我还是不太明白具体的原因啊。

...

对的,由于不是指定类型的数据,读操作会失败,输入缓冲区的读指针不会发生移动,所以这种情况一般需要清空输入缓冲区,如我前面给出的代码所示
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP