Problemas com strings em C

var3tas

Membro
Tenho o seguinte codigo:
Código:
#include <stdio.h>
#include <string.h>

int main(void)
{

struct posicao{
    int x;
    int y;
};

struct dados{
    struct posicao coordenada;
    char nome[25];
    char morada[50];
    char email[30];
    char tipo[20];
    char descanso[15];
    char ferias[30];
    int telefone;
    char obs[50];
};

struct dados restaurante, *r; 

printf("Introduza as coordenadas do restaurante");
printf("\nCoordenada X:");
scanf("%d",&restaurante.coordenada.x);
printf("Coordenada Y:");
scanf("%d",&restaurante.coordenada.y);
printf("Introduza o nome do restaurante:");
scanf("%s",&restaurante.nome);
printf("Introduza a morada do restaurante:");
scanf("%s",&restaurante.morada);
printf("Introduza o email do restaurante:");
scanf("%s",&restaurante.email);
printf("Introduza o tipo de comida do restaurante:");
scanf("%s",&restaurante.tipo);
printf("Introduza o dia de descanso do restaurante:");
scanf("%s",&restaurante.descanso);
printf("Introduza o periodo de ferias do restaurante:");
scanf("%s",&restaurante.ferias);
printf("Introduza o numero de telefone do restaurante:");
scanf("%d",&restaurante.telefone);
printf("Introduza observacoes adicionais sobre do restaurante:");
scanf("%s",&restaurante.obs);


printf("\nCoordenadas: %d,%d",restaurante.coordenada.x,restaurante.coordenada.y);
printf("\nNome: %s",restaurante.nome);
printf("\nMorada: %s",restaurante.morada);
printf("\nEmail: %s",restaurante.email);
printf("\nTipo de Comida: %s",restaurante.tipo);
printf("\nDia de Descanso: %s",restaurante.descanso);
printf("\nPeriodo de Ferias: %s",restaurante.ferias);
printf("\nTelefone: %d",restaurante.telefone);
printf("\nObservacoes: %s",restaurante.obs);

}
e quando corro o programa e tento introduzir (por exemplo) um nome de restaurante que contenha espaços ele atribui às variaveis seguintes cada uma das palavras que estão a seguir aos espaços.

Eu tenho ideia que isto será um erro estupido, mas sera que alguem me pode ajudar?
 
Tens 2 soluções:

1 - Lês as strings com
Código:
fgets(nome_restaurante,sizeof(nome_restaurante),stdin);
e no fim fazes
Código:
nome_restaurante[strlen(nome_restaurante)-1]='\0'
porque a leitura com o fgets deixa um \n (do ENTER) no fim da string.

2 - Fazes
Código:
scanf("%[^\n]",nome_restaurante);
cuja explicação podes ler aqui.
 
Obrigado pela tua resposta!

Em relação à primeira solução, o meu professor não quer que agente use o fgets. Quanto à segunda solução, não funcionou... Ao fazer a alteração, nem me é permitido introduzir nada naquela variavel.
 
A fgets é uma função non grata.
Código:
scanf("%[^\n]%*c", restaurante.nome);
O %*c é para descartar o \n, senão era lido na próxima chamada a scanf().
Não podes por o & em &restaurante.nome porque restaurante.nome já é um apontador e, neste caso como é um vector, é só de leitura.
 
Olha, olha...Mais um aluno do DEI às voltas com o mini-projecto de PPP. Essa questão que aqui colocaste foi explicada pelo prof numa das primeiras aulas teóricas. Um bocadinho mais de atenção e a esta hora já sabias como fazer.

"No caso da linha poder conter espaços usa-se uma outra função. A função gets()"

In Slides da Teórica - Página 115
 
Última edição:
Olha, olha...Mais um aluno do DEI às voltas com o mini-projecto de PPP. Essa questão que aqui colocaste foi explicada pelo prof numa das primeiras aulas teóricas. Um bocadinho mais de atenção e a esta hora já sabias como fazer.

"No caso da linha poder conter espaços usa-se uma outra função. A função gets()"

In Slides da Teórica - Página 115

A função gets() não é segura, gera warnings porque, entre outros, pode resultar em buffer overflow.
O melhor mesmo é usar o fgets, ou o scanf dos posts anteriores(também não sei ao certo o quão segura ela é).
 
Em vez de
Código:
scanf("%[^\n]%*c", restaurante.nome);
coloca
Código:
scanf(" %[^\n]s", &restaurante.nome);
(atenção ao espaço antes do %)
Penso que funcionará.
 
Última edição:
A função gets() não é segura, gera warnings porque, entre outros, pode resultar em buffer overflow.
O melhor mesmo é usar o fgets, ou o scanf dos posts anteriores(também não sei ao certo o quão segura ela é).

Não referi essa função por ser ou deixar de ser segura. Referi-a exclusivamente porque foi a função indicada nas aulas teóricas ;)
 
O getchar() aproveita 1 caracter que se encontre no buffer. Se tiver mais do que 1, vai precisar de mais getchar() e isso não é estético.
 
Resolvi usar a seguinte solução, sugerida pelo professor:

Código:
char str[50];

printf("Introduza o nome do restaurante: ");
fgets(str,25,stdin);
sscanf(str,"%s\n",&restaurante.nome);
mas agora ele corta-me a string logo no primeiro espaço.
Por exemplo se eu escrever "Frango da Guia" ele guarda apena a palavra "Frango".

Porque será
 
Back
Topo