关于c++。 我判断输入是否为数字,并直到输入数字。
#include<iostream>usingnamespacestd;intmain(){intm;while(!(cin>>m)){cout<<"不是数字"<<end...
#include<iostream>
using namespace std;
int main()
{
int m;
while(!(cin>>m))
{
cout << "不是数字"<<endl;
}
return 0;
}
为什么输入字母后会无限循环,应该怎么改?
这个程序错在哪里。 展开
using namespace std;
int main()
{
int m;
while(!(cin>>m))
{
cout << "不是数字"<<endl;
}
return 0;
}
为什么输入字母后会无限循环,应该怎么改?
这个程序错在哪里。 展开
3个回答
展开全部
我来给你正解:
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();是将流清空
怕你听不懂,所以啰嗦了!
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();是将流清空
怕你听不懂,所以啰嗦了!
展开全部
只能用字符或者字符串的方式输入,然后判断是否数字,是则自己手工转换为数字
错在于int型只能接受数字的输入,输入字符不是触发异常停止程序,就是这样的死循环
错在于int型只能接受数字的输入,输入字符不是触发异常停止程序,就是这样的死循环
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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的。
#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的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询