关于C++输入cin的问题,下面的程序,如果输入的不合法,那就将陷入死循环,为什么?如何理解?求高人指点

#include <iostream.h>
main()
{
int i;
while(i!=-1)
{
cout<<"i="
cin>>i; /*请输入不是一个字符如'a'试试*/
cout<<endl;
}
}
上面的程序,如果输入的不合法,那就将陷入死循环。解决的办法 有个一,把cin>>i;语句移到判断循环的语句,那么输入的如果是不合法的变量,他将跳出循环 。

当你在控制台输完数据敲回车后,输入的数据以及回车换行符被同时送到输入缓冲区,例如你输入的数据为a,然后回车,此时输入缓冲区中就有两个字符,一个是‘a’,一个是回车换行符‘/n’,接着程序读取,由于类型不匹配,读取失败,并没有读走输入缓冲区中的数据,也就是说,此时输入缓冲区中还是‘a’,和‘\n’,接着while循环继续读输入缓冲区,依然类型不匹配,于是就成了死循环追问

那为什么把 cin>>i; 这个语句移到判断循环的语句,那么输入的如果是不合法的变量,他将跳出循环呢?

追答

你的意思是写成while(cin>>i){},这样的话,当判断到输入缓冲区的数值的类型不匹配时,cin的方法就会返回一个布尔值fasle,就不再执行循环体了。我也测试过了,当输入不匹配时,确实是返回了0。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-01
"...cin在尝试将输入的字符串读为int型数据失败后,会生成一个错误状态。...流必须处于无错误状态,才能用于输入或输出。"
以上一段文字来自《C++ Primer》
至于输入流处于错误状态后,执行时将如何执行(cin>>i;)这一句,就不太清楚了。
从结果来看, 就像已经忽略掉这句的作用了。
第2个回答  2013-10-01
用 fflush(stdin); 清除一下。
-----------------------------------
while(...)
{
cout<<"i=" ;
fflush(stdin); // 清除一下。
cin >> i;
while (cin.fail()) { // 检查输入错误
cin.clear();fflush(stdin); //// 清除一下。
cout <<"input 1 0" << endl;;
cin >> i;
}
}本回答被网友采纳
第3个回答  2013-10-01
输入失败又不会导致输入的字符消失,下一次读入的还是同样的字符……
相似回答