Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

deboraddo

Struct com char, erro no espaço

Recommended Posts

Boa tarde gente,

 

Estou fazendo um exercício que você tem que fazer uma struct com endereço como rua, número, etc. Meu código dá certo se eu não utilizo o espaço, ou seja, com apenas uma palavra. Acho que deve estar errado o modo como fiz o scanf nas variaveis. Já procurei na internet mas não encontrei nenhuma solução. Alguém poderia me ajudar? Por favor, não me caçoem, ainda estou no primeiro período :(

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Questão 01
int main()
{
printf("<< Endereços! >>\n");
struct enderecos {
char rua[30];
char comp[30];
char cidade[30];
char estado[3];
int num[3];
int cep[3];
};
struct enderecos end;
int i;
for(i=0;i<=2;i++)
{
printf ("%d Rua: ", i+1);
scanf("%s", &end.rua);
printf("%d Numero: ", i+1);
scanf("%d", &end.num);
printf("%d Complemento: ", i+1);
scanf("%s", &end.comp);
printf("%d Cidade: ", i+1);
scanf("%s", &end.cidade);
printf("%d CEP: ", i+1);
scanf("%d", &end.cep);
strcpy(end.estado, "MG");
}
printf ("Enderecos");
for (i=0;i<=2;i++) {
printf ("\n %d endereco\n: RUA %s\n NUM %d\n COMP: %s\n CIDADE: %s\n ESTADO: %s\n CEP:%d\n", i+1,end.rua, end.num, end.comp, end.cidade, end.estado, end.cep);
}
return 0;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para ler strings incluindo espaços você pode fazer com que o [inline]scanf[/inline] leia até a quebra de linha, representada pelo caractere [inline]\n[/inline], que é quando o usuário da enter:

scanf("%[^\n]s",end[i].rua);
Quando se usa alguma formatação avançada o [inline]scanf[/inline] pode acabar deixando restos no buffer de leitura, então recomendo limpar o buffer a cada leitura, algo como:

scanf("%[^\n]s",end[i].rua); // ler rua
scanf("%*c"); // limpa o buffer
scanf("%[^\n]s",end[i].comp); // ler complemento
scanf("%*c"); // limpa o buffer
scanf("%[^\n]s",end[i].cidade); // ler cidade
scanf("%*c"); // limpa o buffer
// (...) resto das leituras
Recomendo este tópico que fala sobre limpeza de buffer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O scanf costuma ser muito problemático quando se usa char, eu costumo usar o fgets..

 

exemplo de uso do fgets

char nome[30];

fgets(nome,30,stdin);

isso evita muitos problemas com buffer e estouro do tamanho, já que eu passo pro fgets a variável o tamanho dela e por onde tá sendo a entrada(como é teclado fica stdin(standard input) se fosse uma stream você colocaria a variavel que representa o arquivo :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.