Ir ao conteúdo
  • Cadastre-se

C Programa não lê o valor char


Malcolm X
Ir à solução Resolvido por isrnick,

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

  • Solução

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
Link para o comentário
Compartilhar em outros sites

@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.");
    }
}

 

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!