Пользовательский ввод как аргумент C ++ - PullRequest
0 голосов
/ 26 сентября 2018

Я новичок в кодировании и мне было интересно, почему мой код работает не так, как я задумал.Я создаю код как учебную программу, чтобы помочь мне практиковать то, что я выучил.Код, кажется, работает нормально, как и ожидалось, когда я закомментирую строки 19 - 23, многострочный комментарий, но когда это не так, он начинает работать неожиданно.

#include <iostream>

int askUserNumber ()
{
    std::cout << "Please input a number: " << std::endl;  //ask user to input number
    int userNumber;                                       //define integer to store input
    std::cin >> userNumber;                               // get input from user

    return (userNumber);                                  // return input to caller
}

void printUserNumber (int userNumber)
{
    std::cout << "Your number input was: " << userNumber << std::endl; //print input to user screen
}

int main ()
{
    /*
    std::cout << "Please input your name: " << std::endl;      // ask user name
    int userName;                                         // variable to store user name
    std::cin >> userName;                                 // get user name
    */

    printUserNumber(askUserNumber());                       // call to askUserNumber to get user input to print to screen
    return(0);
}

Results (Без комментирования кода):

Пожалуйста, введите ваше имя:CoreyПожалуйста, введите номер:Ваш номер был введен: "someGarbageNumber"

Он не позволяет мне ввести число в этой части, и он просто печатает случайное число.

Результаты (с кодом комментирования):

Пожалуйста, введите номер:7Ваш номер был введен: 7

На этот раз все работает отлично и проблем нет.Я не понимаю, почему три строки, спрашивающие имя пользователя, заставляют его не позволять мне вводить число, когда вызов функции printUserNumber (askUserNumber ()) доходит до того, что выводит «Пожалуйста, введите число:» ине позволяет мне ввести один.Спасибо за любые ответы.Я надеюсь, что я написал свой вопрос в хорошем формате и объяснил свою проблему в ясной и прямой форме.Надеемся, что результаты будут раздел также позволит некоторую ясность.С нетерпением жду решения еще раз спасибо.

1 Ответ

0 голосов
/ 26 сентября 2018

Поскольку userName является int, и вы пытаетесь использовать std::cin для считывания в него последовательности нечисловых символов, операция завершается ошибкой и оставляет std::cin в fail() ed.состояние и поэтому ни один из следующих operator>> вызовов std::cin не сможет извлечь дополнительные входные символы.

Он не позволяет мне вводить число в этой части, и это простораспечатывает случайное числосм. при печати. ​​

Все это можно увидеть в справочнике std::basic_istream::operator>>():

  • Если извлечение не удалось (например, если буквабыл введен там, где ожидается цифра), value оставлено без изменений и установлено failbit.(до C ++ 11)
  • Если извлечение не удается, в ноль записывается значение и устанавливается failbit.Если в результате извлечения значение слишком велико или слишком мало, чтобы поместиться в value, записывается std::numeric_limits<T>::max() или std::numeric_limits<T>::min() и устанавливается флаг failbit.(начиная с C ++ 11)

Вы все еще можете восстановиться из такого состояния fail() в потоке, очистив его флаги состояния ошибки и проигнорировав то, что находится в буфере:

int main()
{
    std::cout << "Please input your name: " << std::endl; // ask user name
    int userName;                                         // variable to store user name
    std::cin >> userName;                                 // get user name

    if (!std::cin) // Check if `fail()`
    {
        std::cout << "input stream failure :-(" << '\n';

        // Clearing flags and input buffer
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    else
    {
        std::cout << "Your name input was: " << userName << '\n';
    }

    printUserNumber(askUserNumber());                       // call to askUserNumber to get user input to print to screen

    return 0;
}

Вывод:

Please input your name: 
input stream failure :-(
Please input a number: 
Your number input was: 7

Чтобы получить желаемое поведение, просто сделайте, например, userName a std::string.В этом случае приведенный выше код выдает:

Please input your name: 
Your name input was: Corey
Please input a number: 
Your number input was: 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...