void get_english_input() {
string input = " ";
stringstream my_string(input);
int ft;
double in;
while(true) {
cout << "Enter an integer value of feet." << endl;
getline(cin, input);
my_string << input;
if(my_string >> ft)
break;
cout << "Invalid input! Please try again." << endl;
}
cout << "you entered " << ft << " as the int value for feet." << endl;
/*while(true) {
cout << "Enter a double value of inches." << endl;
getline(cin, input);
my_string << input;
break;
cout << "Invalid input! Please try again." << endl;
}
cout << "we are done entering english input" << endl;
cout << "feet = " << ft << endl;
cout << "inches = " << in << endl;*/
}
此代码应该通过尝试将my_string的内容放入ft来测试输入是否为整数。如果我输入一个字母而不是一个整数,我会收到错误消息“输入无效!请再试一次”,是应该发生的事情。问题是,在我收到一次消息之后,即使下一个输入有效,我也会在之后的每个输入中得到它。
有人建议我应该使用 std :: cin.clear(); 来清除错误标记。我尝试将它放在getline()之前,并没有改变问题。我错误地使用了这个吗?
答案 0 :(得分:3)
您可以重置my_string的错误状态:
my_string.clear();
my_string.ignore( /* big number of choice */ );
但我认为每次重新初始化都会更容易:
while(true) {
cout << "Enter an integer value of feet." << endl;
getline(cin, input);
stringstream my_string(input);
答案 1 :(得分:1)
查看lexical_cast from Boost ...
答案 2 :(得分:0)
强力解决方案是将输入转储到std :: string中,然后遍历字符串并检查每个字符是否在0到9之间。
这不是最优雅的方法。但这很简单而且很愚蠢。 : - )
bool isnum(char c)
{
if(! ( c <= '9' && c >= '0'))
{
return false;
}
return true;
}
bool has_int(std::string &s)
{
for( int i = 0; i < s.length(); i++)
{
if( ! isnum(s[i])
{
return false;
}
}
return true;
}
答案 3 :(得分:0)
我认为
mystring >> ft
将始终评估为真(如果mystring为空,可能不会)。无论mystring是否实际包含数字,该操作仍然有效。
一个想法是
size_t found=input.find_first_not_of("0123456789 ");
if (found!=string::npos)
{
cout << "Invalid input! Please try again."
}
改编自here.