#c
#c
Вопрос:
У меня есть следующий код, он может проверить, является ли ввод целым числом; однако, если вводится что-то вроде «5o», оно все равно проходит, может кто-нибудь помочь мне убедиться, что все цифры, введенные в x, верны, спасибо!
#include <iostream>
using namespace std;
int main() {
cout << "enter x please: ";
int x;
cin >> x;
while (cin.fail()) {
cout << "sorry wrong input, try again: ";
cin.clear();
cin.ignore();
cin >> x;
}
cout << "correct input!";
return 0;
}
Комментарии:
1. Пожалуйста, сделайте мне одолжение: когда ввод неверен, дайте пояснительное сообщение! (еще лучше дать объяснения в начальном вопросе)
2. Вы можете прочитать входные данные в строку и перебирать символы, чтобы проверить, все ли они являются числами. Не забудьте проверить наличие знака (если он может быть): первым символом может быть не только число, но и ‘ ‘ или ‘-‘.
3. Прочитайте входные данные как строку, проверьте, соответствует ли строка вашему определению числа, преобразуйте строку в число. Это единственный пуленепробиваемый подход к проверке ввода.
4. Меня удивляет, как часто код, подобный приведенному выше, рекомендуется в качестве способа проверки ввода, когда, как показывает ваш вопрос, он не работает полностью.
5.
cin >> x
завершается успешно, если есть хотя бы один допустимый символ для использования. Когда вы вводите5o
, есть один допустимый символ для использования, поэтомуcin >> x
он использует его и завершается успешно. Если вы хотите, чтобы строка ввода содержала число и ничего больше, вам нужно (1) прочитать строку и (2) проверить, что она содержит число и ничего больше.
Ответ №1:
Прочитайте всю строку сразу как строку и подтвердите:
#include <iostream>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cctype>
int main()
{
std::printf("Enter x: ");
std::string line;
while (true)
{
if (!std::getline(std::cin, line))
{
std::puts("Stream failed."); // Not much we can do
return -1;
}
if (std::all_of(line.cbegin(), line.cend(), std::isdigit))
break;
else
std::printf("Input is not a number. Try again: ");
}
int const x = std::stoi(line);
std::printf("x = %dn", x);
}