挺久前的一个问题了,因为刚刚才开博客,就作为我的第一篇文章好了,毕竟也是自己摸索出来的(感谢学长给我指明方向)
#include
using namespace std;
int main()
{
int m = 0, n = 0;
do
{
while (cin >> m >> n)
{
if (m >= 1 && m <= 10 && n >= 1 && n <= 10)
break;
else
{
cout << "Please input the number in range of 1 to 10!\n";
cout << "Input two number: ";
}
}
int c;
while ((c = getchar()) != '\n' && c != EOF);
if (m == 0 || n == 0)
{
cout << "Please input number!\n";
cout << "Input two number: ";
}
} while (m == 0 || n == 0);
return 0;
}
这串代码用于输入1到10的两个数并检查错误输入。
如果输入了 a b这样的字母,第20行用于清空输入缓冲。但是换成cin.get()就会出错。
于是便思考cin.get()和getchar()的区别。(似乎除了c和c++以外没别的区别了。。。)
学长的原话是:
“cin.get()不传参数时和ch=getchar()效果一样。
但你这个程序具体为什么会这样我不是特别确定,我觉得是cin>>m>>n那里,因为输入的类型不是int,导致中断了,所以后面全成了EOF(单步调试显示换成cin.get()后c的值恒为-1,即EOF,而且cin>>m>>n后面输出cin.eofbit显示为2,是读到了文件末尾),同样的,循环再执行一次时因为当前是EOF,所以while(cin>>m>>n)依旧读取失败,如此循环往复。
用getchar可以,我猜测是C系列的输入和cin缓冲区不共享(个人认为)。”
然后我便往标志位方向思考,发现cin的错误位被设置时c++会关闭输入流,所以所有istream的方法都无效了,解决方法是在20行的while前面加一句cin.clear()清空标志位
以下是c++ primer plus的内容
综上,c++在cin错误位被设置时会关闭输入流,这时候需要clear()清楚流状态才可以继续输入。(其他流也如此)
另外20行的while语句也可以用cin.ignore(1024)代替,这个函数读取并丢弃个字符
ignore详细传送门:http://blog.sina.com.cn/s/blog_868a5fbd0100vz9l.html