Na aula anterior resolvermos um exercício pedindo ao usuário para informar seu sexo, sua idade, seu peso e sua altura. Se invertermos a ordem, assim: 1) Escreva um programa para pedir ao usuário sua idade, seu peso, sua altura e seu sexo. Será que teremos algum problema?
Sim teremos, e isso tem relação com uma região especial de memória chamada de BUFFER DO TECLADO.
Cada tecla do nosso teclado representa um caractere. Assim, se o usuário digitar por exemplo 27 para sua idade e pressionar a tecla ENTER, 69.8 para seu peso e pressionar a tecla ENTER , 1.72 para sua altura e pressionar a tecla ENTER e f para seu sexo e pressionar a tecla ENTER. Teremos algo assim no buffer do teclado: 27\n69.8\n1.72\nf\n.
É justamente o caractere \n entre 1.72 e a letra f que irá causar o problema, afinal, o ENTER também é um caractere. Veja nesta aula como resolver este problema!
Uma forma muito simples de resolver este problema é colocar um espaço após o último %f e antes do %c na função scanf(). Esse espaço diz ao computador para ignorar espaço, tabulação e ENTER.
char sexo; int idade; float peso, altura; printf("Digite sua idade, peso, altura e seu sexo f ou m: "); scanf("%d%f%f %c", &idade, &peso, &altura, &sexo); printf("Sexo: %c\nIdade: %d\nPeso: %.2f\nAltura: %.2f\n", sexo, idade, peso, altura);
Outra forma de resolver este problema é, fazendo a leitura individual e, antes de pedir o sexo, limpar o buffer de teclado, como a seguir:
char sexo; int idade; float peso, altura; printf("Digite sua idade: "); scanf("%d", &idade); printf("Digite sua peso: "); scanf("%f", &peso); printf("Digite sua altura: "); scanf("%f", &altura); // retirando o ENTER do buffer do teclado scanf("%c");// lendo um caracter sem salvar printf("Digite seu sexo f ou m: "); scanf("%c", &sexo); printf("Sexo: %c\nIdade: %d\nPeso: %.2f\nAltura: %.2f\n", sexo, idade, peso, altura);