caracteres ASCII Leitura fora
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
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