关于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
输入失败又不会导致输入的字符消失,下一次读入的还是同样的字符……

关于C++输入cin的问题,下面的程序,如果输入的不合法,那就将陷入死循环...
接着while循环继续读输入缓冲区,依然类型不匹配,于是就成了死循环

...后输入数字循环正常,但输入字母就会陷入死循环呢?求解!
cin输入原理:程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入.int...

C++关于cin的简单问题。 下面的程序运行有乱码或段错误。 求原因...
i++;} 当进你这个循环管的时候,i=-1,在 while (i < j) {上一行加i++;

C++程序问题,请大虾解答.为啥非法输入是数字这个程序正常,但是是字母之 ...
如果能正常退出,说明程序没有问题,是对的。因为你其它的非法输入所对应的ASCII码基本都不会是1,2,3,0,比如说大写字母好像是从65还是67开始的,小写字母是从97开始的,这些非0数在for循环中做条件判断时都是被认为是真值,所以会一直进循环 。要想实现你的意图,要么把choice改成char型,要么就...

c++用for循环来cin的话要怎样,我的程序出了什么问题啊?纠结了好半天了...
首先,你cin语句 不用加setw ,你输入时候用一个空格间隔就行了,你输出语句用 setw(2),把setw后面的数据限制在2个宽度(当实际输出大于2个宽度时,会按实际长度输出),所以唯一的可能性就是你 输出了 124 大于2个长度了,你用的编译器不支持输出实际长度。你可以换VS2010试试,我运行没有问题。...

为什么c++执行这个程序时不能循环输入,而是不停的输出? 怎么改进才能...
可以循环输入的。cin是一个阻塞函数,不可能会一直循环

C++ 关于cin输入
\/\/注意着两张图片,第二张 我把cin一行注释起来了,由于类型不同,int a并没有储存你输入的a的adcll码,

c++用cin输入数组问题
只能先用一行输入a,再用一行输入b[a]——因为cin是从右边开始压栈的,就是先压b[a]再压a,显然压b[a]时还不知道a是多少,后面输入了a,但改变不了已经压栈了的内容。就是说这种情况一定要保证操作b[a]时a必须是已知的。但这种东西与编译器关系很大,也许后来的编译器异想天开,弄个别致的...

c++ 关于cin.clear()的一点小问题
include <conio.h> using namespace std;int main(){ int a = 0 , b = 1;cin >> a ;cout << a << endl ;if(cin.fail())\/\/如果发生输入错误的话 { cin.clear(); \/\/清除cin流的错误状态 cin.ignore();\/\/提取并舍弃错误输入 } cin >> b ;cout << b << endl;} ...

c++ 的cin输入和类型通用的问题
中间包含了强制类型转换,比如double型赋值给int整型,就会发生数据截断。 而输入流“cin>>”没有此功能,它只要求输入的内容与变量的类型相符即可,若不相符,则此语句为非法(但是并非所有的编译器都报错)。自动忽略此语句。数据在内存中保存为二进制形式,也即ASCII码,没有错误。祝你好运!!

相似回答