문제

내 친구는 독서 캐릭터가 예기치 않은 행동을 일으키는 상황을 보여주었습니다. 캐릭터 '¤'을 읽으면 프로그램이 충돌했습니다. 나는 '¤'이 164 소수점이므로 ASCII 범위를 초과한다고 결론을 내릴 수있었습니다.

우리는 '¤'에 대한 행동을 알아 차렸다. 그러나 모든 캐릭터> 127은 문제를 보여주는 것으로 보인다. 문제는 어떻게 우리가 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;
}


masse@libre:temp/2009-11-30 $ ./a.out 
¤
 -62 0xffffffc2
¤ -92 0xffffffa4
도움이 되었습니까?

해결책

귀하의 시스템은 UTF-8 문자 인코딩을 사용하고 있습니다 (필요한대로) 문자 '¤'은 프로그램이 바이트 시퀀스를 읽게합니다. C2 A4. a char 하나의 바이트는 한 번에 하나씩 읽습니다. 살펴보십시오 wchar_t 그리고 해당 wcin 그리고 wcout 스트림은 멀티 바이트 문자를 읽을 수 있지만, 어떤 인코딩을 지원하는지 또는 로케일과 어떻게 플레이하는지 모르겠습니다.

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

(이것은 nitpick이고 다소 비정규이지만 당신의 while(input) 해야한다 while(cin), 그렇지 않으면 무한 루프를 얻을 수 있습니다.)

다른 팁

친구의 프로그램이 코드를 보지 않고 왜 충돌하는지 말하기는 어렵지만 char를 배열로 인덱스로 사용하기 때문일 수 있습니다. 일반 ASCII 범위를 벗어난 캐릭터는 서명 된 숯의 한계를 넘어 낼 것이므로 숯은 음수를 나타냅니다.

대신 '입력'을 부호없는 숯으로 선언하십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top