2017-04-09 6 views
5

아래 코드를 사용하여 다른 입력을 전달하려고 시도했지만 메시지를 인쇄하지 못했습니다. "죄송합니다. ASCII char을 입력하지 않았습니다. y 또는 n 중 하나만 입력하십시오!" char 타입이 아닌 다양한 Unicode 문자를 입력했습니다 (ALT + 난수, 예 : ™, š, ², Ž, ±). 아무 것도 오류를 생성하지 않았습니다. cin은 자동으로 입력을 무시하거나 무시합니다. ASCII 문자std :: cin이 명령 행에서 사용자 입력을 char 유형의 변수로 전달하지 못합니까?

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 : 윈도우 10 64 비트, x64 기반 프로세서 컴파일러 : 비주얼 스튜디오 커뮤니티 2015

나는 비 ASCII 문자를 추출 "검색을 통해이 문제를 해결 할 수 없습니다 cin C++ "에서 처음 세 페이지를 살펴 보겠습니다.

저는 Stack Overflow에서 매우 새로워졌습니다. 이 질문에 대해 규칙이나 행동 강령을 위반 한 경우 용서하십시오. 나는 learncpp.com에서 C++을 배우고 있으며, page의 2 번 질문에 대답하기 위해 자신의 코드를 작성하고 있습니다.

업데이트 : 내 프로그램이 문자가 입력되었는지 여부를 확인할 이유가없는 것 같습니다. 그러나 아마 내가 프로그램에 실제로 필요한 것이 아닌지 너무 많이 생각하지 않았다는 것을 알고 싶어했을 것입니다.

답변

1

std::cin.fail();은 기본 스트림이 데이터 읽기 또는 쓰기에 실패하면 true를 반환합니다. 그것은 당신이 제공하는 인코딩과 관련이 없습니다.

또한 char은 실제로 utf-8 또는 ASCII를 인식하지 못하므로 단지 바이트 일뿐입니다. C++ 스트림은 데이터의 인코딩을 검증하지도 않습니다.

따라서이 경우 Ž (및 기타)은 std::cin의 유효한 입력입니다. 당신이 ASCII 문자 만 유효성을 검사 할 경우

사용자가 직접 수행해야합니다

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

일반'char' :

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

, 당신은 y 또는 n에 대해 검증 할 필요가 공통 시스템에서 127을 결코 초과하지 않을 것입니다. –

+0

@MM'char'가 실제로 서명되지 않았다면 어떨까요? –

+0

만약 그것이 아니라면? OP는 MSVC++ 2015를 말했습니다. –