Domanda

Un mio amico mi ha mostrato una situazione in cui la lettura di personaggi ha prodotto comportamenti inaspettati. Leggere il personaggio "& # 164;" ha causato l'arresto anomalo del suo programma. Sono stato in grado di concludere che "& # 164;" è 164 decimale quindi è oltre l'intervallo ASCII.

Abbiamo notato il comportamento su "& # 164;" ma qualsiasi personaggio sembra mostrare il problema. La domanda è: come potremmo leggere in modo affidabile tali caratteri char by 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
È stato utile?

Soluzione

Il sistema utilizza la codifica dei caratteri UTF-8 (come dovrebbe), quindi il carattere '¤' fa sì che il programma legga la sequenza di byte C2 A4 . Poiché un char è un byte, li legge uno alla volta. Esamina i flussi wchar_t e i corrispondenti wcin e wcout per leggere i caratteri multibyte, anche se non so quali codifiche supportano o come gioca con i locali.

Inoltre, il tuo programma sta producendo UTF-8 non valido, quindi non dovresti davvero vedere quei due caratteri: ho dei punti interrogativi sul mio sistema.

(Questo è un pignolo e un po 'offtopico, ma il tuo while (input) dovrebbe essere while (cin) , altrimenti otterrai un ciclo infinito.)

Altri suggerimenti

È difficile capire perché il programma del tuo amico si sta arrestando in modo anomalo senza vedere il codice, ma potrebbe essere perché stai usando il carattere come indice in un array. Poiché i caratteri al di fuori del normale intervallo ASCII supereranno il limite di un carattere con segno, il carattere finirà in negativo.

dichiara invece 'input' come carattere senza segno

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top