Ir ao conteúdo

C Programa não lê o valor char


Ir à solução Resolvido por isrnick,

Posts recomendados

Postado

Estou tentando entrar com H-Homem ou M-Mulher.

Mas meu scanf não entra.

Ajudem-me.

main()
{
    float h, pideal=0;
    char sexo;
    printf("Qual sua altura: ");
    scanf("%f",&h);
    printf("Digite seu sexo:\n");
    printf("H - Para Homem\nM - Para Mulher:\n");
    scanf("%c",&sexo);
    if(sexo == 'H')
    {
        pideal=(72.7*h)-58;
        printf("Seu peso ideal eh de %f Kg",pideal);
    }
    else if(sexo == 'M')
    {
        pideal=(62.1*h)-44.7;
        printf("Seu peso ideal eh de %f Kg",pideal);
    }
    else
    {
        printf("\nERRO! voce nao digitou corretamente.");
    }
}

Fac¸a um programa que receba a altura e o sexo de uma pessoa e calcule e mostre seu
peso ideal, utilizando as seguintes f ´ ormulas (onde h corresponde `a altura):
Homens: (72:7 h) 􀀀 58
Mulheres: (62; 1 h) 􀀀 44; 7

  • Solução
Postado

Mude:

    scanf("%c",&sexo);

Para:

    scanf(" %c",&sexo);

Ou seja, incluindo o espaço antes do %c no scanf, para descartar o caractere nova linha '\n' (e qualquer outro caractere vazio como espaço, tabulação, etc, que tiver) que ficou sobrando do scanf anterior (o caractere é adicionado à entrada quando você aperta Enter no terminal/cmd), assim o %c no scanf não vai mais ler esse caractere nova linha como a entrada digitada pelo usuário.

  • Curtir 2
Postado

@isrnick Funcionou, mas continuo sem entender o porque tem q dá um espaço. Tem um"\n" invisível dentro do scanf eh isso? Ai quando você dá espaço elimina ele? husahaus

 

Segue o código corrigido:

main()
{
    float h, pideal=0;
    char sexo;
    printf("Qual sua altura: ");
    scanf("%f",&h);
    printf("Digite seu sexo:\n");
    printf("H - Para Homem\nM - Para Mulher:\n");
    scanf(" %c",&sexo);
    if(sexo == 'H')
    {
        pideal=(72.7*h)-58;
        printf("Seu peso ideal eh de %f Kg",pideal);
    }
    else if(sexo == 'M')
    {
        pideal=(62.1*h)-44.7;
        printf("Seu peso ideal eh de %f Kg",pideal);
    }
    else
    {
        printf("\nERRO! voce nao digitou corretamente.");
    }
}

 

Postado
50 minutos atrás, Malcolm X disse:

@isrnick Funcionou, mas continuo sem entender o porque tem q dá um espaço. Tem um"\n" invisível dentro do scanf eh isso? Ai quando você dá espaço elimina ele? husahaus

 

Quase isso.

 

Veja, o seu primeiro scanf é:

    scanf("%f",&h);

Logo espera ler um número decimal racional (número com ponto flutuante).

 

Então quando executar o programa e ele perguntar "Qual sua altura: ", você vai digitar um número no terminal, como 1.8 por exemplo, e então vai apertar Enter para confirmar.

 

Na prática isso significa que você digitou 4 caracteres no terminal '1', '.', '8' e '\n' (quando apertou Enter), ou seja agora tem "1.8\n" na stream de entrada padrão (stdin).

 

scanf por sua vez vai pegar os caracteres relevantes para o tipo de dado que ele espera ler, nesse caso ele espera ler um número decimal racional, logo ele vai ler os caracteres "1.8" da entrada padrão, converter para o formato de número de ponto flutuante float, e armazenar no endereço de memória apontado por &h.

 

Mas note que o scanf não leu o caractere '\n' da entrada padrão, pois não é relevante para o tipo de dado que ele espera ler, logo ficou sobrando "\n" na entrada padrão sem ser lido.

 

O seu próximo scanf que era:

    scanf("%c",&sexo);

Esperava ler 1 caractere, mas já tem 1 caractere na entrada padrão, o caractere '\n', portanto ele vai ler esse caractere e armazenar no endereço apontado por &sexo. Aí o programa acaba nem dando a oportunidade para o usuário digitar um caractere novo para ser armazenado na variável.

 
adicionado 20 minutos depois

 

 

 

Edit:

@Malcolm X

 Agora se não quiser ter que lidar com esse problema eu fiz uma versão do scanf que nunca deixa nada sobrando na entrada padrão:

 

 

  • Curtir 2
  • Obrigado 1
  • Amei 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...