Pergunta

Um amigo meu me mostrou uma situação onde os personagens de leitura produzido um comportamento inesperado. Lendo o personagem '¤' causou seu programa de acidente. Eu era capaz de concluir que '¤' é 164 decimal por isso é ao longo do intervalo ASCII.

Percebemos o comportamento on '¤', mas qualquer personagem> 127 parece mostrar o problema. A questão é como é que lemos confiável tais personagens carbonizar por caractere?

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
Foi útil?

Solução

O sistema está usando UTF-8 codificação de caracteres (como deveria) para que o caractere '¤' faz com que seu programa para ler a seqüência de bytes C2 A4. Desde a char é um byte, ele lê-los um de cada vez. Olhar para o wchar_t eo wcin correspondente e wcout córregos para ler caracteres de vários bytes, embora eu não sei qual codificações eles apoiam ou como eles jogam com localidades.

Além disso, o programa é saída inválido UTF-8, então você realmente não deveria estar vendo esses dois personagens -. Recebo pontos de interrogação no meu sistema

(Este é um nitpick e um pouco offtopic, mas o seu while(input) deve ser while(cin), caso contrário, você vai ter um loop infinito.)

Outras dicas

É difícil dizer por que o programa do seu amigo está falhando sem ver o código, mas poderia ser porque você está usando o caractere como um índice em uma matriz. Desde caracteres fora do intervalo ASCII regular irá estourar o limite de um caractere assinado, o caractere vai acabar negativo.

declarar 'input' como char não assinado, em vez

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top