2009-11-30 3 views
0

내 친구가 독서 캐릭터가 예기치 않은 동작을 일으키는 상황을 보여주었습니다. 문자 '¤'를 읽으면 그의 프로그램이 충돌하게됩니다. 나는 '¤'이 십진수 164이므로 ASCII 범위를 초과한다고 결론 내릴 수 있었다.ASCII 외부 문자 읽기

우리는 '¤'의 동작을 알아 차렸지만 어떤 문자> 127이 문제를 나타내는 것으로 보입니다. 문제는 어떻게 char에 의해 그러한 문자 char을 신뢰할 수있게 읽을 것인가입니다.

int main(int argc, const char *argv[]) 
{ 
    char input; 
    do 
    { 
     cin >> input; 
     cout << input; 
     cout << " " << setbase(10) << (int)input; 
     cout << " 0x" << setbase(16) << (int)input; 

     cout << endl; 
    } while(input); 
    return 0; 
} 


[email protected]:temp/2009-11-30 $ ./a.out 
¤ 
 -62 0xffffffc2 
¤ -92 0xffffffa4 

답변

2

시스템은 UTF-8 문자 인코딩을 사용하고 (예상대로) 그래서 문자 "¤은 '바이트 C2 A4 시퀀스를 판독하는 프로그램을 발생 부호 문자 등

+0

wchar_t, wcin 및 wcout에서 유니 코드 문자를 처리 할 때 무한 루프가 발생합니다. – Masse

+0

'while (input)'을 변경하지 않았다면 어쨌든 무한 루프가 발생합니다. –

+0

예고했습니다. 그러나 while (input) 동안조차도 나는 문자를 괜찮습니다. 소프트웨어에 EOF를 주려고했을 때만 무한 루프가 발생했습니다. wchar을 사용하면 모든 nonascii 문자에 무한 루프가 발생합니다. – Masse

1

코드를 보지 않고 친구의 프로그램이 충돌하는 이유를 알기는 어렵지만, char을 배열의 색인으로 사용하고 있기 때문일 수 있습니다. 정규 ASCII 범위를 벗어나는 문자는 부호있는 문자의 한계를 초과하므로 문자는 음수로 끝납니다. 대신

1

선언'입력 '. char은 1 바이트이므로 한 번에 하나씩 읽습니다. wchar_t 및 해당 wcinwcout 스트림을 멀티 바이트 문자를 읽을 수 있는지 확인합니다. 그러나 지원하는 인코딩이나 로케일과의 연동 방법을 알지 못합니다.

또한 프로그램에서 유효하지 않은 UTF-8을 출력하므로 실제로이 두 문자를 보지 않아야합니다. 시스템에 물음표가 표시됩니다.

+0

내가 거의 같은 동작을 얻을

는 (그렇지 않으면 무한 루프를 얻을 수 있습니다., 이것은 nitpick 다소 논외이지만, 당신의 while(input)while(cin)해야한다). 194 0xc2 ¤ 164 0xa4 두 번째 인쇄물은 여전히 ​​유효하지만 두 장의 인쇄본이 있습니다. – Masse

+0

게시 할 때 UTF-8 태그를 놓친 것 같습니다. 죄송합니다. –