Ir ao conteúdo

C Meu codigo nao esta reconhecendo valor colocado no SCANF


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

bom estou tentando fazer uma especie de cadastro de pessoas utilizando 2 strings e 2 doubles

exemplo: Nome, sexo, peso, saldo disponivel

porém apos compilar o codigo os unicos valores reconhecidos sao as strings ja os numeros flutuantes nao aparecem no resultado final 

 

image.png.d02ce1641958caffbe5fd90daa985dc5.png

 

void main ()
{
char nome[50];
char sexo[2];
double peso, saldo;


    printf("Cadastrando a primeira pessoa:\n");
    
    printf("Digite o nome da primeira pessoa\n");
    gets(nome);
    fflush(stdin);
    
   		 printf("Agora digite o Sexo:\n", sexo);
    		gets(sexo);
    			fflush(stdin);
    	 printf("Agora digite o Peso:\n", &peso);
		 	fflush(stdin);
    		scanf("%f", &peso);
    		    	printf("Por ultimo o saldo:\n", &saldo);
					fflush(stdin);
    		scanf("%f", &saldo);
    	printf("----------------------------------------\n");
     		printf("Nome: \t %s\n" 
            		"Sexo: \t %1s\n"
            		"Peso: \t %2fKG\n" 
            		"Saldo: \t R$%2f\n",    nome, sexo,peso, saldo);      

}

 

Postado

Seu programa ainda não está bom. Tem várias cosias que precisa considerar.

 

  • main() retorna um int. Nunca declare void
     
  • seus dados ficam melhor como uma estrutura, uma Pessoa por exemplo
     
    typedef struct
    {
        char nome[50];
        char sexo[2];
        double peso;
        double saldo;
    
    }   Pessoa;


     

  • Seu cadastro é um cadastro de Pessoa, e tem uma capacidade e um certo número de Pessoa dentro, a menos que vá alocar dinamicamente os valores. Então algo assim ficaria mais claro
     

    typedef struct 
    {
        int     quantas;
        Pessoa  P[20];
    
    }   Cadastro;


    E muito mais fácil de programar ;)

     

  • não use gets() NUNCA. Só vai ter problemas, isso se seu compilador aceitar. E pode cancelar seu programa a toa se o cara digitar mais que os 50 bytes que reservou, porque gets() não controla.... Use fgets()
     

  • Nunca use fflush() para a entrada. Sequer está definido. No fundo, nunca use fflush() a menos que precise de coisas como por exemplo liberar um buffer de transmissão ou enviar algo para o disco para ter certeza de que foi gravado. No geral, deixe o sistema cuidar dos buffers de arquivo. 
     

  • TESTE sempre o retorno de scanf(). Não tem um manual? scanf() retorna um int com o total de itens lidos. Qual o propósito de seguir com o programa se não conseguiu ler o peso de uma pessoa? O programa não vota a menos que você mande, então mande ele voltar e ler. Ou encerre logo. É ingênuo simplesmente seguir adiante.
     

  • Não misture formatação com lógica, lendo dados no meio do processo em que imprime os dados por exemplo
     

  • Use constantes e não escreva nunca um programa interativo antes de testar a lógica. Só vai perder tempo

    EXEMPLO

    Esse programa cria um cadastro e coloca uns registros dentro. Veja a ideia geral

 

Eis a saída
 

toninho@dsp$ gcc -o tst -Wall -std=c17 ch0323.c
toninho@dsp$ ./tst
4 pessoas no cadastro. Nome da ultima: Kris Kristofferson, saldo =    80.02
toninho@dsp$ 

 

E o programa
 

#include <stdio.h>

typedef struct
{
    char nome[50];
    char sexo[2];
    double peso;
    double saldo;

}   Pessoa;

typedef struct 
{
    int     quantas;
    Pessoa  P[20];

}   Cadastro;

int main (void)
{
    Cadastro cad; // um cadastro
    cad.quantas = 0; // marca como vazio

    Pessoa Jhonny = { "Jhonny Cash", "M", 80., 80.01 }; // uma pessoa
    Pessoa Kris = { "Kris Kristofferson", "M", 80., 80.02 }; // outra pessoa 
    
    cad.P[ cad.quantas++ ] = Jhonny;
    cad.P[ cad.quantas++ ] = Jhonny;
    cad.P[ cad.quantas++ ] = Jhonny;
    cad.P[ cad.quantas++ ] = Kris;

    printf( "%d pessoas no cadastro. Nome da ultima: %s, saldo = %8.2f\n",
        cad.quantas, 
        cad.P[ cad.quantas-1 ].nome, // o vetor comeca em ZERO
        cad.P[ cad.quantas-1 ].saldo 
    );
    return 0;
}
 

 

  • Curtir 1
  • Obrigado 1
Postado

As variáveis numéricas foram declaradas como double, mas seu programa está usando o especificador float. E tem outras coisas que você pode corrigir e melhorar. Veja os warnings do seu compilador como este,

 

main.c:21:15: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘d

ouble *’ [-Wformat=]

 

 

  • Curtir 1
  • Amei 1
  • Solução
Postado

@mrkiraz     creio que você não tenha colocado o especificador de tipo da variável adequado no scanf , pois você declarou peso como sendo double   mas fez a leitura como se essa variável fosse float ,  então use a letra L antes do f e tudo Irã bem , e para escrever o double  use mesmo o %.2f

  • Curtir 1
  • Amei 1
Postado

Muito obrigado a todas as respostas me ajudaram demais apesar do meu código ainda estar simples ainda vou melhorar ele então quero já agradecer bastante ao @arfneto que deu mts dicas pra melhorar tipo valeu mesmo mano foi de muita ajuda e tmb ao @Midori e @devair1010 pois eu agora eu consegui arrumar ali onde declarei como double mas estava tentando ler como float apos corrigir isso ele conseguiu ler sem problemas ❤️

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!