我已经创建了一个用于控制用户输入的功能,以便用户可以输入任何内容并包括一长串字母,并且该功能会输出“输入错误”并重复直到输入一个数字。 (然后将它们用于switch语句或初始化值。)
这适用于所有事情,除非我输入“0” - 这里它给出了错误的输入而不是0,好像0不是数字。 字符串是否与正常数字不同?有谁知道如何解决这个问题? 谢谢。
float user_input(string input_name){
string line;
float variable;
bool x = true;
while (x == true)
{
cout<<"\nPlease enter the "<<input_name<<": ";
getline(cin, line);
istringstream Str_variable(line);
Str_variable >> variable;
if (variable){
//cout<<"\nIn function"<<input_name<<"= "<<variable<<endl;
x = false;
}
else{
cout<<"Incorrect input. Please try again"<<endl;
}
}
return(variable);
}
答案 0 :(得分:2)
更改为:
// Ensure extraction suceeded and the whole line was consumed.
// This will detect invalid inpts such as "1.17abc",
// whereas if eof() was not present "1.17abc" would be
// considered valid with a value of "1.17".
//
if (Str_variable >> variable && Str_variable.eof())
{
break; // and just use while (true) instead.
}
else
{
std::cerr<< "Incorrect input: " << line << ". Please try again" << std::endl;
}
检查提取结果,而不是提取后变量的值。在发布的代码中,当输入0
时,由于条件失败,未输入if (variable)
分支。
此外,请参阅strtof()
以获取替代方案。
答案 1 :(得分:1)
您的if
条件未检查流提取运算符(>>
)是否成功,它正在检查variable
是否为非零。
可以像这样检查流提取操作符的结果:
if(Str_variable >> variable)
{
x = false;
}
//...
有关如何将值转换为布尔值的更多信息,请查看this answer on SO或the cppreference.com section on Boolean conversions。