Я сделал функцию для управления пользовательским вводом, чтобы пользователь мог вводить что угодно и включая длинную строку букв, а функция выдавала "Неправильный ввод" и повторяется до тех пор, пока не будет введен номер. (Они затем используются для оператора 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);
}
Изменить на:
// 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()
для альтернативы.
Условие if
не проверяет, был ли успешным процесс удаления потока (>>
), проверяет, отлична ли variable
или нет.
Результат оператора извлечения потока можно проверить следующим образом:
if(Str_variable >> variable)
{
x = false;
}
//...
Дополнительные сведения о преобразовании значений в Booleans см. В этом ответе на SO или в разделе cppreference.com о логических преобразованиях.