paulo1205
(usa Ubuntu)
Enviado em 12/10/2013 - 08:38h
A função
getc() devolve um valor do tipo
int. Desse modo, você deveria declarar a variável que recebe o valor por ela retornado como
int.
No seu programa, você declarou
get como ponteiro para caracteres. Uma variável do tipo ponteiro serve para armazenar
endereços de memória onde possa haver dados, não para guardar os dados, em si.
Imaginando a execução do seu programa, da forma como ele está, se você enviar para porta serial a letra "A", cujo valor decimal correspondente é 65, a variável
get vai entender aquilo como sendo o endereço 65 da memória. Faz sentido? Você sabe o que existe na posição 65 da memória? Sabe ao menos se a posição 65 realmente foi alocada pelo sistema operacional para o seu programa? Depois, quando mais tarde você tentar usar esse endereço como argumento da função
printf() para obter uma string, seu programa falha porque provavelmente não tem autorização para usar a referida posição de memória.
A forma de corrigir é:
1) Trocar o tipo de
get para
int (aliás, trocar o nome da variável para algo mais descritivo também não seria má ideia).
2) Trocar a conversão "%s" (imprimir a string situada no endereço indicado por um ponteiro) na chamada a
printf() por "%c" (imprimir o caráter indicado por um argumento inteiro).
Você não precisa ter medo de usar
int pelo fato de ter de ler tanto caracteres quanto números, até porque, no fim das contas, tudo o que o computador manipula são números. Mesmo o tipo
char, apesar do nome, é um inteiro em C, só que uma precisão possivelmente menor do que
int (por exemplo, 8 bits para
char e 32 para
int). A notação
'A' significa literalmente "o valor numérico correspondente ao símbolo
A".
Além disso, a função
getc() retorna um valor do tipo
int, e não
char, para poder indicar erros: se o valor retornado for maior que ou igual a zero, então se conseguiu ler um caráter válido; caso contrário, o valor retornado será negativo (mais especificamente, terá o valor da constante
EOF, que normalmente vale -1). Depois de você determinar que a leitura foi bem sucedida, você pode, se quiser, mover o dado lido para uma variável do tipo
char e seguir trabalhando com ela.