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.

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.