1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Problemas com strings em C

Discussão em 'Programação' iniciada por var3tas, 24 de Abril de 2008. (Respostas: 15; Visualizações: 1044)

  1. 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?
     
  2. Baderous

    Baderous Banido

    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.
     
  3. 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.
     
  4. The_True_Eue

    The_True_Eue Power Member

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

    Neptune 1st Folding then Sex

    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: 24 de Abril de 2008
  6. LuisFP

    LuisFP Power Member

    É só pessoal do DEI aqui!
     
  7. MadOnion

    MadOnion Folding Member

    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 é).
     
  8. zgruli

    zgruli Power Member

    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: 24 de Abril de 2008
  9. Neptune

    Neptune 1st Folding then Sex

    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 ;)
     
  10. koust

    koust Power Member

    após o scanf() utiliza um getchar(). o getchar(), sem estar aliado a nada, remove o \n do buffer.
    abraços
     
  11. Baderous

    Baderous Banido

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

    Neptune 1st Folding then Sex

    Para limpar o que lá possa ficar basta meter:

    scanf("%*[^\n]")
     
  13. 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á
     
  14. Com esta solução funcionou!

    Obrigado a todos pela vossa ajuda!
     
  15. duffy

    duffy Power Member

    Para não teres os stresses do gets(), usa a função gets_s()
     
  16. Baderous

    Baderous Banido

Partilhar esta Página