Я попытался передать различные входные данные с помощью приведенного ниже кода, но не смог напечатать сообщение: «Ой, вы не ввели символ 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 этого страница.
Обновление: я полагаю, у моей программы нет причин проверять, введен ли символ. Однако, я думаю, может быть, мне было так любопытно узнать, что я не особо задумывался о том, действительно ли это было необходимо для программы.
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*/ }
Других решений пока нет …