强大的数字用户输入功能,但零不被视为数字

时间:2014-02-24 13:19:05

标签: c++ string input cin getline

我已经创建了一个用于控制用户输入的功能,以便用户可以输入任何内容并包括一长串字母,并且该功能会输出“输入错误”并重复直到输入一个数字。 (然后将它们用于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);
}

2 个答案:

答案 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 SOthe cppreference.com section on Boolean conversions