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

求好手解答一段小程序的输出结果为什么会是这样的

2013-06-26 
求高手解答一段小程序的输出结果为什么会是这样的!#includeiostreamusing namespace stdint main(){int

求高手解答一段小程序的输出结果为什么会是这样的!


#include<iostream>
using namespace std;

int main()
{
int ival;
while (cin >> ival , !cin.eof())
{
if (cin.bad())
{
throw runtime_error ("IO stream Corrupted");
}

if (cin.fail())
{
cerr << "bad data, try again" << endl;
cin.clear(istream::failbit);
continue;
}


}


return 0;

}


输入:q ,再按回车键
输出:
bad data, try again
bad data, try again
bad data, try again
bad data, try again
bad data, try again
bad data, try again
………………………………
问题:我认为结果应该是输出 一句bad data, try again后,再让我进行输入字符操作,而不是一执死循环下去。求高手回答为什么结果会是这样。
[解决办法]
        if (cin.fail())
        {
            cerr << "bad data, try again" << endl;
            //cin.clear(istream::failbit);
            std::cin.clear();// 恢复状态标志
            std::cin.ignore(10, '\n');// 略过缓存

            continue;
        }
[解决办法]
是回车符的问题,你输出了q之后,然后按了回车。
加上  getchar();
可在  if (cin.fail()) 里面或者外面加都行。
[解决办法]
你定义的是int,输入q,会设置failbit位,同时q字符仍留在cin对象的输入流中,你的代码中并没有清理它,所以就死循环了。修改后如下:
#include<iostream>
using namespace std;

int main()
{
int ival;
while (cin >> ival , !cin.eof())
{
if (cin.bad())
{
throw runtime_error ("IO stream Corrupted");
}

if (cin.fail())
{
cerr << "bad data, try again" << endl;
cin.clear(istream::goodbit);// 等同于cin.clear(),清除所有状态位
while (cin.get() != '\n')
continue;// 读取并丢弃上次输入留在缓冲流中的字符
// continue;// 此语句可有可无
}
}

return 0;

}


你也可以将
while (cin.get() != '\n')
continue;

替换成cin.get(); 
清理掉q字符就好了

热点排行