Может ли std :: cin не передать пользовательский ввод из командной строки в переменную с типом char?

Я попытался передать различные входные данные с помощью приведенного ниже кода, но не смог напечатать сообщение: «Ой, вы не ввели символ ASCII, не говоря уже о том, что у или n!» Я ввел различные символы Unicode, которые не относятся к типу char (в основном это оправданное перфорирование в ALT + случайные числа, например, ™, š, ², Ž, ±. Ни один из них не выдал ошибку. Cin молча игнорирует или отбрасывает входные данные, которые не являются Символы ASCII?

std::cout << "Would you like to play again? Enter y or n: ";
std::cin >> yOrN;
isChar = std::cin.fail();
//check if the user did not enter an ASCII char, e.g. test with a Unicode character
if (isChar)
{
std::cout << "Oops, you did not enter an ASCII char, let alone one that is y or n!\n";
std::cin.clear();
}

ОС: Windows 10 64 бит, процессор на базе x64
Компилятор: Visual Studio Community 2015

Я не смог решить эту проблему, выполнив поиск «извлечь не-ASCII символ Cin C ++» и просмотрев первые три страницы.

Я очень новичок в переполнении стека, поэтому прости меня, если я нарушил какие-либо правила или кодекс поведения с этим вопросом. Я изучаю C ++ на learncpp.com и пишу свой собственный код, чтобы ответить на вопрос 2 этого страница.

Обновление: я полагаю, у моей программы нет причин проверять, введен ли символ. Однако, я думаю, может быть, мне было так любопытно узнать, что я не особо задумывался о том, действительно ли это было необходимо для программы.

5

Решение

std::cin.fail(); вернет true, если базовый поток не смог прочитать или записать данные. это не имеет ничего общего с предоставленной вами кодировкой.

Стоит также отметить, что char на самом деле не знает utf-8 или ASCII, это просто байт. потоки C ++ также не проверяют кодировку данных.

Так что в этом случае Ž (и другие) является действительным вкладом для std::cin,

Если вы хотите проверить только символы ASCII, вам нужно сделать это самостоятельно:

std::cin >> c;
if (c < 0 || c > 127) { /*handle non ASCII chars*/  }

В вашем случае вам нужно проверить против y или же n:

std::cin >> c;
if (c != 'y' && c != 'n') { /*handle invalid input*/  }
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]