Как проверить все правильные входные цифры C

#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);
}