Надежная числовая функция пользовательского ввода, но ноль не рассматривается как число

0

Я сделал функцию для управления пользовательским вводом, чтобы пользователь мог вводить что угодно и включая длинную строку букв, а функция выдавала "Неправильный ввод" и повторяется до тех пор, пока не будет введен номер. (Они затем используются для оператора 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);
}
Теги:
string
input
cin
getline

2 ответа

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() для альтернативы.

  • 0
    Если я использую: «if (Str_variable >> variable && Str_variable.eof ())», то теперь я получаю только неверные данные. (Хотя вы правы, что 1.17abc = идет до 1.17) Я думал, что то, что я написал, означало, что если бы переменная была числом, моя функция вернула бы число, если нет, то пользователю придется повторить попытку. Это то, что кажется, если я не введу ноль. Вы знаете, почему он не распознает ноль? Спасибо за вашу помощь.
  • 0
    На самом деле у меня все еще был "Str_variable >> variable;" до утверждения if, так что это не сработало. Теперь я избавился от этого, и я думаю, что это работает. Спасибо за помощь.
1

Условие if не проверяет, был ли успешным процесс удаления потока (>>), проверяет, отлична ли variable или нет.

Результат оператора извлечения потока можно проверить следующим образом:

if(Str_variable >> variable)
{
    x = false;
}
//...

Дополнительные сведения о преобразовании значений в Booleans см. В этом ответе на SO или в разделе cppreference.com о логических преобразованиях.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню