paulo1205
(usa Ubuntu)
Enviado em 19/09/2016 - 20:24h
Antes de falar da pergunta principal, permita-me sugerir que não use nem “
fflush(stdin)” nem tampouco “
fpurge(stdin)”. Nenhuma das duas funções é portável para outros sistemas. Um jeito de fazer o que você quer é suprimir essas duas funções, e trocar aquela chamada a
scanf() pelo seguinte.
scanf("%19[^\n]%*1[\n]", c) /* Limita o tamanho máximo para caber no array, e ainda retira a quebra de linha do buffer. */
Melhor ainda se você testar eventuais situações de erro. Leia a documentação de
scanf().
Agora à dúvida original...
Conjuntos de caracteres estendidos e os diversos meios de representá-los são temas bastante complexos. Mesmo na sua própria máquina, se você trocar o valor de uma simples variável de ambiente, tudo o que você viu e relatou aqui pode mudar radicalmente.
O que você observou parece indicar que você está usando um conjunto de caracteres Unicode, codificado através da representação UTF-8. UTF-8 utiliza um comprimento de bytes variável para representar diferentes faixas de caracteres: um byte para caracteres de 0 a 127, dois bytes para 128 a 2047, três bytes, para 2048 a 65535, quatro bytes para 65536 até 1114111, que é o limite superior atualmente usado pelo Unicode.
Uma forma simplória (e padronizada pelo C) de fazer o que você quer é trabalhar com as funções de conversão entre strings
multibyte (array de
chars) e
wide characters (
wchar_t) ou strings de
wide characters.
Para isso, a primeira coisa a fazer a instruir o programa a usar uma representação de locales adequada (por padrão, o sistema usa a locale defaut do C, mesmo que o sistema esteja configurada com outra locale ). Depois disso, você pode usar
mbstowcs() e
wcstombs(). Uma vez de posse dos
wide characters, você pode usar as funções de <wctype.h> (análogas para
wchar_t das funções de <ctype.h>, usada sobre caracteres comuns).