Ler duas letras seguidas no C
Se tem uma coisa que sempre me incomoda na programação em linguagem C é a leitura de caracteres.
Veja o código a seguir, ele parece correto. Na teoria você faz a leitura de um número de depois de uma letra e depois mostra esses dados. Na prática, somente o número lido está disponível. Isso porque o valor que acabou sendo lido para a variável de char foi o que indica uma nova linha (do enter que você deu ao entrar o número.
int main(void) {
char a;
int x;
scanf("%d", &x);
scanf("%c", &a);
printf("\n: %i : %c : ", x, a);
return 0;
}
Sabendo do motivo, você pode buscar soluções, como a apresentada a seguir. Nessa solução eu primeiro fiz a leitura da letra e depois do número. Isso resolve.
int main(void) {
char a;
int x;
scanf("%c", &a);
scanf("%d", &x);
printf("\n: %i : %c : ", x, a);
return 0;
}
Outra forma que funciona é fazer a leitura das entradas em um único comando, como mostro no código abaixo.
int main(void) {
char a;
int x;
scanf("%d %c", &x, &a);
printf("\n: %i : %c : ", x, a);
return 0;
}
Essa segunda forma inclusive, funciona quando precisamos ler várias letras seguidas, como no código a seguir, onde mostra a leitura de um número seguido de duas letras.
int main(void) {
char a, b;
int x;
scanf("%d %c %c", &x, &a, &b);
printf("\n: %i : %c : %c : ", x, a, b);
return 0;
}
Mas nem sempre é possível utilizar o scanf com todas as variáveis de uma vez. Muitas vezes é preciso fazer um printf para indicar ao usuário, antes de cada scanf, o que ele precisa fornecer de dados. Mas isso ainda tem solução.
Como eu disse, o problema do scanf de um caractere é que ele acaba lendo o caractere de nova linha. Uma gambiarra que pode ser utilizada é uma leitura falsa para pegar esse caractere que não se tem interesse. Veja que faço a leitura repetida no scanf. A primeira pega o caractere de nova linha e a segunda pega a letra efetivamente.
#include <stdio.h>
#include <string.h>
int main(void) {
char a, b;
int x;
scanf("%d", &x);
scanf("%c", &a);
scanf("%c", &a);
scanf("%c", &b);
scanf("%c", &b);
printf("\n: %i : %c : %c : ", x, a, b);
return 0;
}
Existem outras formas de fazer a leitura de caracteres, mas eu ilustrei algumas básicas possíveis. Muitos recomendam o uso da função fflush(stdin), mas ela não funciona sempre.