Ir ao conteúdo
  • Cadastre-se

C leitura de string e um valor flutuante


viniciosbarbosa
Ir à solução Resolvido por vangodp,

Posts recomendados

tenho uma duvida de como fazer a leitura de uma string

minha leitura

scanf(" %s %f",produtoc,&qtd);

tenho que ler uma string com nome e um float separado por um espaço;

ate então normal lê mais quando vou imprimir só esta saindo a ultima string lida  e o resto nada;

minha saida5a220e2dc9c01_Capturadetelade2017-12-0200-20-27.thumb.png.059d3ca0b7f7ec76d427b27753b95ea2.png

Link para o comentário
Compartilhar em outros sites

16 horas atrás, vangodp disse:

mande o programa para averiguar

 

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
typedef struct{
    char produto[50];
    float preco;

}f;


int main() {
    f feira;



     	int n,i,j,k;
    	scanf("%d",&n);
	for(i=0;i<n;i++) {
	int qtdp;
	scanf("%d",&qtdp);
	f vet[qtdp];

	for(j=0;j<qtdp;j++){
        printf("informe o produto\n");
	scanf("%s %f",feira.produto,&feira.preco);
	vet[i]=feira;
	}
	for(j=0;j<qtdp;j++){
	printf("%s %f\n",vet[j].produto,vet[j].preco);

    	}
	}

	return 0;
}

 

adicionado 2 minutos depois

@vangodp so esta salvando o ultimo o resto se  perde.

Link para o comentário
Compartilhar em outros sites

  • Solução

vamos lá...
Primeiro você não deve por espaços entre especificadores dentro do scanf. El fato de usar especificadores como " %s %d", com espaços, pode certamente gerar erros no seu programa pois um espaço em scanf significa uma coisa completamente diferente em scanf e em printf. No printf um espaço é um espaço, mas no scanf um espaço quer dizer que você quer ignorar um espaço, e dependendo de onde vai o espaço quer dizer outra coisa, como por exemplo antes de um especificador, pode ignorar por exemplo a supressão do caractere enter em uma leitura anterior. Em outras palavras, a menos que queira ignorar certos caracteres com scanf não use espaços no scanf.
Segundo e mais importante é que você esta lendo sem limpar o buffer, isso gera outros tantos problemas ao ler chars e strings com outras variáveis de por meio. Procure limpar o buffer antes de ler um char ou uma string, ou você pode levar esse tipo de surpresas.
Dicas:
Tome o nome e numero em scanfs separados, o programa deveria funcionar meio assim:
Informe o nome: tomate
quantidade: 3

Em código seria algo como:
Informe o nome: tomate
preço: 3
 

    f lista[100];
    
    printf("Informe o nome: ");
    scanf("%s", lista[0].produto); 
    printf("valor: "); 
    scanf("%s", &lista[0].preco);
    //Limpar buffer aqui... antes de uma nova leitura
    printf("Informe o nome: ");
    scanf("%s", lista[1].produto); 
    printf("valor: "); 
    scanf("%s", &lista[1].preco);
    //Limpar buffer aqui... antes de uma nova leitura
    ...

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@vangodp

16 horas atrás, vangodp disse:

vamos lá...
Primeiro você não deve por espaços entre especificadores dentro do scanf. El fato de usar especificadores como " %s %d", com espaços, pode certamente gerar erros no seu programa pois um espaço em scanf significa uma coisa completamente diferente em scanf e em printf. No printf um espaço é um espaço, mas no scanf um espaço quer dizer que você quer ignorar um espaço, e dependendo de onde vai o espaço quer dizer outra coisa, como por exemplo antes de um especificador, pode ignorar por exemplo a supressão do caractere enter em uma leitura anterior. Em outras palavras, a menos que queira ignorar certos caracteres com scanf não use espaços no scanf.
Segundo e mais importante é que você esta lendo sem limpar o buffer, isso gera outros tantos problemas ao ler chars e strings com outras variáveis de por meio. Procure limpar o buffer antes de ler um char ou uma string, ou você pode levar esse tipo de surpresas.
Dicas:
Tome o nome e numero em scanfs separados, o programa deveria funcionar meio assim:
Informe o nome: tomate
quantidade: 3

Em código seria algo como:
Informe o nome: tomate
preço: 3
 


    f lista[100];
    
    printf("Informe o nome: ");
    scanf("%s", lista[0].produto); 
    printf("valor: "); 
    scanf("%s", &lista[0].preco);
    //Limpar buffer aqui... antes de uma nova leitura
    printf("Informe o nome: ");
    scanf("%s", lista[1].produto); 
    printf("valor: "); 
    scanf("%s", &lista[1].preco);
    //Limpar buffer aqui... antes de uma nova leitura
    ...

 

muito obrigado por sua ajuda, mais percebi que colocou %s para a leitura de inteiro.

Bom meu compilador não reconheceu mais eu também tinha errado, era um valor flutuante. 

Pois bem meu código ficou desta forma eu tinha que ler o numero de ida a um supermercado/feira por exemplo, e depois ler o numero de produtos de estoque, depois em um loop eu ia pegar o nome e o valor, depois de pegar todos eu pego o numero de itens que ela comprou, depois disso o usuário informa o nome do produto e a quantidade comprada depois computa e no fim mostra o valor das idas ao supermercado/feira.

OBS:  para onde eu precisava do código não poderia existir printfs a não ser o da saída.5a230cd104743_Capturadetelade2017-12-0218-26-33.thumb.png.b27460d1f39f47b0e7cfe28e808b4541.png

meu codigo;

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
typedef struct{
    char produto[50];
    float preco;

}f;
typedef struct{
    char item[50];
    int quantidade;
}c;


int main() {
    int n,i,j,k,g,m;
    float veto[1000];
    //quantidade de loop
    scanf("%d",&n);
	for(i=0;i<n;i++) {
        int qtdp;
        scanf("%d",&qtdp);
        f lista[qtdp];
            for(m=0;m<qtdp;m++){
        //printf("Informe o nome: ");
        scanf("%s",lista[m].produto);
        //printf("valor: ");
        scanf("%f",&lista[m].preco);
    }
    int qtdc;
    scanf("%d",&qtdc);
    c compra[qtdc];
    for(j=0;j<qtdc;j++){
        //printf("Informe o nome: ");
        scanf("%s",compra[j].item);
        //printf("valor: ");
        scanf("%d",&compra[j].quantidade);
    }
    float vet[qtdc];
    int res;
    for(k=0;k<qtdc;k++){
            for(g=0;g<qtdp;g++){
                //comparaçao de elemento
                res=strcmp(compra[k].item,lista[g].produto);
                //se 0 sao igual
                //se nao fazer nada
                if(res==0){
                vet[i]=vet[i]+compra[k].quantidade*lista[g].preco;


            }
        }

    }
    //passagem de vetor pra fora do loop;
    veto[i]=vet[i];
	}
	for(j=0;j<n;j++){
            printf("R$ %.2f\n",veto[j]);
    }

	return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

11 horas atrás, viniciosbarbosa disse:

percebi que colocou %s para a leitura de inteiro

Esqueci.... costume de copiar e pegar sem mudar as coisas. Mesmo assim minha intenção é a de sugerir a limpeza do buffer ao ler vários strings, mas se seu programa funciona assim beleza, eu nunca tive problemas com o buffer porque o conheço perfeitamente, talvez um dia desses faça algum video explicando como funciona e como evitar erros.

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!