Um detalhe sobre leitura de caracteres com scanf

Um detalhe sobre leitura de caracteres com scanf

por Francisco Reverbel -
Número de respostas: 0
Um dos problemas que eu resolvi na aula de hoje tinha o seguinte enunciado: "Dados n > 0 e uma sequência de n caracteres representando um texto, determinar a frequência relativa de vogais no texto."

A solução que eu coloquei na lousa foi mais ou menos assim:
int main()
{
    int n, i, conta_vogais;
    char c;

    printf("Digite o valor de n: ");
    scanf("%d", &n);
    printf("Digite n caracteres: ");
    conta_vogais = 0;
    for (i = 0; i < n; i++) {
        scanf("%c", &c);
        c = tolower(c);
        if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
            conta_vogais++;
        }
    }
    printf("Frequencia de vogais: %d/%d.\n", conta_vogais, n);
    return 0;
}
No final da aula um aluno, que tinha digitado essa solução num notebook, me mostrou que ela não funcionava. (Sim, aconteceu de novo! Acho que vou proibir notebooks na sala de aula! piscando)

O erro é bastante sutil e tem a ver com um detalhe do funcionamento do scanf com "%c". Para mais informações, vejam os arquivos que eu coloquei neste diretório. Olhem esses arquivos em sequência (começando pelo freq_vogais1.c), dando especial atenção aos comentários que explicam qual é o erro e as várias formas de evitá-lo.