Переменные типа Char как входные данные для вопроса типа "да / нет" - PullRequest
1 голос
/ 09 мая 2020

Я спрашиваю пользователя, хочет ли он выпить. Единственный ответ, который может ввести пользователь, - это Y для «да» и N для «нет», после чего наступает заключительный диалог. Я сделал ответ char: char answer;, затем добавил оператор if. Если пользователь набирает Y или N, все в порядке. Однако, когда пользователь вводит Y(+ any letter), например YHTY, программа все равно принимает его (то же самое касается N). Мне просто нужен однобуквенный ответ Y или N, а другой ответ помимо этого приведет к диалогу else.

Это код:

    #include <iostream>

    using namespace std;

    int main()
    {
        char answer;

        cout << "Do you want a drink? " << endl;
        cout << "Y/N: ";
        cin >> answer;

        if(answer == 'Y' || answer == 'y'){
            cout << "Okay. I'll bring you some." << endl;
        }   else if(answer == 'N' || answer == 'n'){
            cout << "Okay suit yourself." << endl;
        }   else{
            cout << "Please type just Y/N." << endl;
        }
        return 0;
    }

Ответы [ 2 ]

1 голос
/ 09 мая 2020

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

#include <string>

    string answer;

    cout << "Do you want a drink? " << endl;
    cout << "Y/N: ";
    getline(cin, answer);
    if (answer == "Y" || answer == "y") {

getline считывает одну строку текста и помещает ее в строку.

Хотя это делает именно то, что вы сказали, вероятно, не совсем то, что вы хотеть. Предположим, пользователь вводит пробел, а затем Y, я ожидал бы, что это будет обрабатываться точно так же, как если бы он только что набрал Y, но приведенный выше код отклонит любой ввод с пробелами. Проверка ввода всегда сложнее, чем вы думаете, и новичку не стоит тратить на это время (ИМХО).

0 голосов
/ 09 мая 2020

cin примет только первую букву ввода как answer, так как тип данных char, я не вижу здесь никаких проблем, он должен обслуживать ваши потребности. Вы можете проверить приведенное выше утверждение с помощью кода ниже:

    #include <iostream>

    using namespace std;

    int main()
    {
        char answer,a2;

        cout << "Do you want a drink? " << endl;
        cout << "Y/N: ";
        cin >> answer;
        cin>>a2;
        cout<<endl<<a2<<endl;

        if(answer == 'Y' || answer == 'y'){
            cout << "Okay. I'll bring you some." << endl;
        }   else if(answer == 'N' || answer == 'n'){
            cout << "Okay suit yourself." << endl;
        }   else{
            cout << "Please type just Y/N." << endl;
        }
        return 0;
    }

a2 будет содержать второй символ на входе.


Но если вы действительно хотите проверить только один символ, тогда вы можете изменить тип данных answer на char[] или string, тогда вы можете сначала проверить длину ввода, а затем проверить значение.

    #include <iostream>

    using namespace std;

    int main()
    {
        char str[3], answer;

        cout << "Do you want a drink? " << endl;
        cout << "Y/N: ";
        cin >> str;
        answer=str[0];

        if(str[1]!='\0'){ // Checks if second char is not NULL char i.e. str length is not 1
            cout << "Please enter one character only." << endl;
        }   else if(answer == 'Y' || answer == 'y'){
            cout << "Okay. I'll bring you some." << endl;
        }   else if(answer == 'N' || answer == 'n'){
            cout << "Okay suit yourself." << endl;
        }   else{
            cout << "Please type just Y/N." << endl;
        }
        return 0;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...