• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

n1ckooo

Ler string inserida (problema)

6 mensagens neste tópico

Pessoal tive a ver qual era a melhor "função" para ler strings inseridas por um utilizador e cheguei a conclusão que era a fgets.

Acontece que no meu programa usando a função fgets não consigo comparar eficientemente a string.

#include <stdio.h>

main() 
    {
        char str_exit[4]= "fim" ;
        char str_user[20];
        int i;
        float preco;
        do
        {
            printf("Designacao do Produto\n");
            fflush(stdin);
            fgets(str_user,20,stdin);
          
            printf("Insira o preco do produto\n");
            scanf("%d",&preco);
            i = strcmp(str_exit,str_user);
        }while(i == 0 );
        
        
        
       
        //printf("\n%s\n",str_user);
        //printf("\n%d\n",i);
   
        system("pause"); 
   
    }

se trocar a instrução fgets(str_user,20,stdin); por scanf("%s", str_user);

o programa já funciona bem e a comparação funciona perfeitamente dando 0 quando as strings são iguais. Alguém me pode explicar esta situação sendo pelo que li a "fazer" fgets era mais eficiente que scanf ou mesmo que gets.

obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em primeiros tens 2 warning's no teu programa:

    • Falta-te o #include <string.h>

  • Quando estás a ler preço, essa variável é float, mas no scanf tens %d que é para inteiros, ou seja, tens que trocar por %f

Em relação à comparação de string's, o problema é que quando estás a ler a string está esquecer-te do "\n" que vem com ela.... Por isso é que nunca vão ser iguais, porque uma tem o "\n" e a outra não....

Eu acho que o melhor é usar o scanf para ler string's.... O gets é melhor não usar por causa do possível overflow e o fgets por causa dos problemas que estás a ter....

Na Wiki aqui do fórum está como ler string's com espaços através da função scanf....

/* Ler os dados até se introduzir ENTER */
scanf("%[^\n]", cmd);
/* Limpar o buffer */
scanf("%*[^\n]"); scanf("%*c");

cumps  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para retirar o '\n' basta fazer:

fgets(str_user,20,stdin);
str_user[strlen(str_user)-1]='\0';

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para retirar o '\n' basta fazer:

fgets(str_user,20,stdin);
str_user[strlen(str_user)-1]='\0';

Pronto  :), é também uma solução.... (Por acaso, não sabia que se podia fazer assim)....

Já agora, nesse fgets está a ler 20 caracteres, certo?!

E se a string que eu introduzir só tiver 5 caracteres, os outros 15 ficam com o que?! Memória aleatória?! Lixo?!

E se eu introduzir uma string com 25 caracteres, o fgets grava a string ou corta ao chegar aos 20?!

cumps  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pessoal resolvi de outra forma: em vez de retirar inseri na outra string um "\n"

ou seja:

 char str_exit[4]= "fim\n" ;

obrigado pelas vossas sugestões

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E se a string que eu introduzir só tiver 5 caracteres, os outros 15 ficam com o que?! Memória aleatória?! Lixo?!

E se eu introduzir uma string com 25 caracteres, o fgets grava a string ou corta ao chegar aos 20?!

Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or a the End-of-File is reached, whichever comes first.

A newline character makes fgets stop reading, but it is considered a valid character and therefore it is included in the string copied to str.

A null character is automatically appended in str after the characters read to signal the end of the C string.

http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

Se só introduzires 5 caracteres, o 5º será o '\n'. Após esse caracter, a leitura pára e é acrescentado o '\0' no fim.

Se introduzires 25, ele corta nos 20.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora