Каким образом ввод, подобный 123cplusplus, является допустимым целым числом при чтении с помощью cin?

#c

#c

Вопрос:

 #include<iostream>
using namespace std;
int main()
{
    int val;

    if(cin>>val)
        cout<<"Valid Input"<<" "<<val<<endl;
    else
        cout<<"Invalid input"<<" "<<val<<endl;
    return 0;
}
  

Если я даю ввод целому числу
например, 123, тогда условие внутри if равно true, и оно работает нормально, и если я ввожу строку или символ
в качестве входных данных, тогда часть else работает нормально.Но если я ввожу ввод, подобный 123cplusplus, тогда он печатает допустимый
ввод, но 123cplusplus не является целым числом. почему?

когда я ввожу недопустимый ввод, тогда выводится значение переменной «val», равное 0. Поскольку значение val не инициализируется в программе, то как оно получает значение 0 после чтения недопустимого ввода?

Комментарии:

1. «но 123cplusplus — это строка» , а «123» также является строкой. Когда вы читаете из потока символов, вы всегда читаете строку.

Ответ №1:

Когда он считывает, 123cplusplus он считывает 123 число val , затем он поймет, что это больше не число, и оставит cpluscplus его во входном потоке.

Комментарии:

1. Вспомогательная информация: страница документации

2. спасибо. у меня есть еще одно сомнение. поскольку вы говорите, что он понимает, что это больше не число, тогда он должен сделать условие ложным внутри if и выполнить часть else ?

3. @AbhinavRaj вам нужно думать в терминах потока. Для вас 123cplusplus — это одна строка. Для потока это 1, за которым следует 2, за которым следует 3, за которым следует c…. Если вам нужно, чтобы 123cplusplus был отклонен, вам нужно указать потоку читать его как строку, пока не будет достигнут разделитель, а затем использовать инструмент, который рассмотрит всю строку и отклонит, если она не полностью состоит из допустимых цифр.

Ответ №2:

Поскольку значение val не инициализируется в программе, то как оно получает значение 0 после считывания недопустимого ввода?

Поскольку val он не инициализирован, он имеет неопределенное значение. Если выражение выдает неопределенное значение, поведение программы не определено (есть некоторые исключения, которые здесь не применяются). В вашей else ветке val имеет неопределенное значение, когда вы вставляете его в выходной поток. В этом случае поведение программы не определено.

Ответ №3:

Прочитайте ввод в строку и проверьте, содержит ли ввод что-либо, кроме числа, вы получите правильный результат.

     std::string input;

    cin >> input;

    if(  std::all_of( input.begin(), input.end(), 
        []( unsigned char c ) { return std::isdigit( c ) ; } ) )
    {
        std::cout << "Valid Input " << input << std::endl;
    }
    else
    {
        std::cout << "Invalid input " << input << std::endl;
    }
  

std::all_of проверьте, возвращает ли предикат true для всех элементов.