首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

依照《C++ Primer》使用cin.fail()时出现了死循环

2013-10-11 
按照《C++ Primer》使用cin.fail()时出现了死循环代码如下,如果输入23ab则会无限循环,怎么回事?如何解决?编

按照《C++ Primer》使用cin.fail()时出现了死循环
代码如下,如果输入
2
3
ab
则会无限循环,怎么回事?如何解决?编译器是VS 2008


#include <iostream>

using std::runtime_error;
using std::cerr;
using std::cin;
using std::cout;
using std::endl;

void keep_window_open();

int main()
{
int ival;
// read cin and test only for EOF; loop is executed even if there are other IO failures
while (cin >> ival, !cin.eof()) 
    {
try
{
if (cin.bad()) // input stream is corrupted; bail out
throw runtime_error("IO stream corrupted!");
}catch(runtime_error err)
{
cout<<err.what()<<endl;
}

if (cin.fail()) // bad input

cerr<< "bad data, try again: "; // warn the user
cin.clear(std::istream::failbit); // reset the stream
continue; // get next input
}
// ok to process ival
}

keep_window_open();
}

void keep_window_open()
{
cout << "\nPress any key to exit:";
getchar();
}
c++ cin.fail()
[解决办法]
 while (!cin.eof(),cin>>ival) 试下
[解决办法]
饿,看错了- - 忽视我吧
[解决办法]
这该是vs的一个bug吧,cin.clear(std::istream::failbit);竟然没有重置掉流的状态,所以,下次检测一直cin.fail()为真,就死循环了。。。。 
这个是primer上例子,代码应该没有问题的,那么就是vs问题了,我是vs2010,一样的死循环!!!
[解决办法]
这是PRIMER上的一个错误例子, 这个例子在论坛里每个月要被提起N次, 无奈了.

clear是设置状态, 不是清空状态, 自己看cplusplus:http://www.cplusplus.com/reference/ios/ios/clear/
[解决办法]
在cin.clear 后面加一句cin.ignore(); 
哦了
[解决办法]
哦。。。还有个地方忘了说 
failbit 请改成 goodbit 

[解决办法]
引用:
这是PRIMER上的一个错误例子, 这个例子在论坛里每个月要被提起N次, 无奈了.

clear是设置状态, 不是清空状态, 自己看cplusplus:http://www.cplusplus.com/reference/ios/ios/clear/

没错 所以要改的话 是设置为goodbit才对
[解决办法]
俄,原来如此.反正我第一次听说.哈哈,又学到一手!
[解决办法]
我是这样想的,你这里毕竟输入了一个错值,所以如果你不处理的话,即使你设置了流的状态,下次判断还会出错,所以,你要在后面加上跳过这个字符的语句,比如cin.get()或者cin.ignore()等,这样就没问题了哈.快给分..

热点排行