2017-04-09 62 views
5

Próbowałem przekazać różne dane wejściowe z poniższym kodem, ale nie udało się wydrukować komunikatu: "Ups, nie wprowadziłeś znaku ASCII, nie mówiąc już o tym, że jest y lub n!" Wprowadziłem różne znaki Unicode, które nie są typu char (w zasadzie usprawiedliwione wybijanie w ALT + liczb losowych, np. ™, š, ², Ž, ±. Żadna z nich nie spowodowała błędu. Czy cin cicho ignoruje lub odrzuca wejścia, które nie są znaków ASCIICzy std :: cin nie może przekazać danych wejściowych użytkownika z wiersza poleceń do zmiennej o typie znaku?

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(); 
} 

OS: Windows 10 64 bit x64 procesor Kompilator Visual Studio Społeczność 2015

I nie był w stanie rozwiązać ten problem poprzez poszukiwanie „wydobyć charakter non-ASCII cin C++ "i patrząc na pierwsze trzy strony:

Jestem bardzo nowy w Stack Overflow, więc wybaczcie, jeśli naruszyłem jakiekolwiek zasady lub kodeks postępowania z tym pytaniem. Uczę się C++ na stronie learncpp.com i piszę własny kod, aby odpowiedzieć na pytanie 2 tego page.

Aktualizacja: Myślę, że nie ma powodu, aby mój program sprawdzał, czy wprowadzono znak. Myślę jednak, że być może byłam tak ciekawa, że ​​nie zastanawiałam się zbytnio nad tym, czy program był rzeczywiście potrzebny.

Odpowiedz

1

std::cin.fail(); Zwróci wartość true, jeśli bazowy strumień nie odczytał lub nie zapisał danych. nie ma nic wspólnego z kodowaniem, które zapewniasz.

Warto również wspomnieć, że char nie jest tak naprawdę świadomy UTF-8 lub ASCII, to tylko bajt. również strumienie C++ nie sprawdzają kodowania danych.

W tym przypadku Ž (i inne) jest poprawnym wprowadzeniem dla std::cin.

Jeśli chcesz sprawdzić poprawność ASCII tylko znaki, trzeba to zrobić samemu:

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

W twoim przypadku trzeba sprawdzić poprawność przeciwko y lub n:

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

zwykły 'char' nigdy nie przekroczy 127 na wspólnych systemach –

+0

@MM co jeśli 'char' jest faktycznie unsigned? –

+0

co, jeśli tak nie jest? OP powiedział MSVC++ 2015. –