Frage

Ein Freund von mir hat mir gezeigt, eine Situation, wo das Lesen Zeichen unerwartetes Verhalten erzeugt. Das Lesen der Zeichen ‚¤‘ verursacht sein Programm zum Absturz bringen. Ich konnte zu dem Schluss, dass "¤ 164 dezimal ist, so dass es über den ASCII-Bereich ist.

Wir haben festgestellt, das Verhalten auf ‚¤‘, aber alle Zeichen> 127 scheint das Problem zu zeigen. Die Frage ist, wie würden wir zuverlässig solche Zeichen von char char lesen?

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
War es hilfreich?

Lösung

Ihr System ist mit UTF-8-Zeichenkodierung (wie es sein sollte), so das Zeichen ‚¤‘ bewirkt, dass Ihr Programm die Reihenfolge der Bytes C2 A4 zu lesen. Da ein char ein Byte ist, liest er sich einen nach dem anderen. Schauen Sie in die wchar_t und den entsprechenden wcin und wcout Ströme Mehrbytezeichen zu lesen, obwohl ich weiß nicht, welche Kodierungen sie unterstützen oder, wie sie spielen mit locales.

Auch Ihr Programm ausgibt ungültige UTF-8, so dass Sie sollten wirklich nicht, diese beiden Zeichen sehen werden. - Ich Fragezeichen auf meinem System bekommen

(Dies ist eine nitpick und etwas offtopic, aber Ihre while(input) while(cin) werden soll, sonst werden Sie eine Endlosschleife bekommen.)

Andere Tipps

Es ist schwer zu sagen, warum Programm Ihres Freundes abstürzt, ohne den Code zu sehen, aber es könnte sein, weil Sie die Zeichen als Index in ein Array verwenden. Da Zeichen außerhalb des regulären ASCII-Bereich wird die Grenze eines signed char überlaufen, wird das Zeichen auf negativ beenden.

deklariert 'Input' als unsigned char statt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top