#include<iostream>usingnamespacestd;intmain(){intm;while(!(cin>>m)){cout<<"不是数字"<<endl;}return0;}为什么输入字母后会无限循环,应该怎么改?这个程序错在哪里。... #include<iostream>
using namespace std;
int main()
{
int m;
while(!(cin>>m))
{
cout << "不是数字"<<endl;
}
return 0;
}
为什么输入字母后会无限循环,应该怎么改?
这个程序错在哪里。 我来给你正解:
1.首先说明:cin>>是输入流,当执行成功时,他会返回一个流对象,其实就是个引用,说白了就是指针,当失败时会返回0。这个你可以试下,打出来的是地址:
int n;
void* p = (cin>>n);
cout << p << endl;
2.while(!(cin>>m)),因为m是int型,所以只接收int型输入值,当你输入数字时,cin>>m执行成功,>>返回的是地址,地址是正值,即为ture,所以!(cin>>m)为false,不满足while循环条件,所以程序直接over。
3.反之,当你输入字母时,符合while条件进入循环,但是为啥会不断循环呢?因为,你输入不正确,cin内含的状态值ios_base被置为ios_base:: failbit,此时cin状态为错,不接受任何输入。然后就成了这种死循环了。要改的话首先重置cin状态为ios_base::goodbit,此外还要清空输入缓冲区中的错误数据。
while(!(cin>>m))
{
cin.clear();
cin.sync();
cout << "不是数字"<<endl;
}
cin.clear();是将输入流状态置为goodbit
cin.sync();是将流清空
怕你听不懂,所以啰嗦了! #include <iostream>
#include <string>

using namespace std;

int main()
{
while (true)
{
string str;
cin >> str;
bool b_all_num = true;
for (unsigned int i = 0; i < str.size(); i++)
{
if (!(str[i] >= '0' && str[i] <= '9'))
{
b_all_num = false;
break;
}
}

if (b_all_num)
{
break;
}
}

return 0;
}

cin用的是流输入,兄弟,可以随便存的。

================================================
cin表示将输入的内容,已二进制流的方式,保存到一个地址空间去。虽然你一个int型的变量保存的是会截断,但是cin>>m是不会返回false的。