Как проверить, содержит ли пользовательский ввод более одной буквы, и правильно ли он отображается в C++

Я пытаюсь понять, как предотвратить продолжение моего кода, если пользователь ввел более 1 символа. Я пробовал просматривать форумы, но я не мог найти правильные ответы, которые я искал.

В основном я пытаюсь проверить, ввел ли пользователь более 1 символа, и предложить им повторить попытку, если они это сделали.

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

        //gets student's last initial. Checks if the input is a 1 letter character
        //has a response if it is not
        bool lastEntry = false;
        while (lastEntry != true){
            cout << "Please enter the initial of your last name: " << endl;
            cin >> lastInitial;

            if (isalpha(lastInitial)) {
                cout << "Last initial has been logged." << endl;
                lastEntry = true;
            } 
            else {
                cout << "That is an invalid choice. Please enter a letter: " << endl;
                cin >> lastInitial;
            }//end if
        }//end while loop

        //prints summary of student's input and displays output
        cout << "Your name initials are: " << toupper(firstInitial) << toupper(lastInitial) << endl;
        cout << "Once swapped, your name initials will be: " << toupper(lastInitial) << toupper(firstInitial) << endl;
    }//end Choice A option

Когда я тестирую его, числовая проверка работает, но когда я набираю более 1 символа для ввода, мой код завершается. Вот что он показывает:

введите здесь описание изображения

Примечания: firstInitial и lastInitial объявлены в начале моего кода как:

char firstInitial;
char lastInitial;

В настоящее время у меня есть #include iostream и #include ctype.h, и я использую //using namespace std;//, чтобы удалить использование std:: в моем коде. Если это было специально задано, я извиняюсь; и, пожалуйста, пришлите мне ссылку на ответ! Если мой код может быть более эффективным, сообщите мне об этом! Спасибо.


person theAlphaMelon    schedule 09.03.2019    source источник
comment
Я прав, что на самом деле это два вопроса?: 1.) Как предотвратить ввод более одной буквы? 2.) Почему выводится целое число? Поскольку Ройя дала ответ на 2.), я считаю, что не так просто предотвратить вашу первую проблему со стандартной библиотекой. ввод/вывод. Что бы я порекомендовал: прочитайте std::string с std::getline(), чтобы длина ввода не повредила. После этого вы можете оценить длину. Если это 0 => ОШИБКА! Повторите еще раз. Если это 1 =>, просто возьмите начало строки как символ. В противном случае (› 1) вы можете сделать то же самое и сделать дополнительно ПРЕДУПРЕЖДЕНИЕ! Пожалуйста, внимательно рассмотрите то, что было запрошено.   -  person Scheff's Cat    schedule 09.03.2019
comment
Привет Шефф, да два вопроса. Можно ли по-прежнему писать std:: в сочетании с использованием пространства имен std;? Я все еще только несколько недель изучаю C++, поэтому мне было бы полезно знать такие мелочи на будущее, если мне снова понадобится решать проблемы. Спасибо за помощь!   -  person theAlphaMelon    schedule 10.03.2019


Ответы (1)


toupper возвращает целое число, и вам нужно преобразовать его в char при печати. Нравится :

static_cast<char>(toupper(lastInitial))
person Roya Ghasemzadeh    schedule 09.03.2019
comment
Может быть, стоит упомянуть, что std. библиотека имеет множество перегруженных потоков operator<<, где потоки для целочисленных типов выводят значение (десятичное или любое другое), за исключением char и unsigned char (и, следовательно, также int8_t и uint8_t), которые вместо этого печатают символ. (используя значение, например, как значение ASCII) - person Scheff's Cat; 09.03.2019
comment
Привет, Ройя, спасибо за это, я использовал их в своей программе, и теперь она выводит правильно! - person theAlphaMelon; 10.03.2019