Jump to content
Sign in to follow this  
n1ckooo

Ler string inserida (problema)

Recommended Posts

n1ckooo

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

Share this post


Link to post
Share on other sites
zecapistolas

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

Share this post


Link to post
Share on other sites
Baderous

Para retirar o '\n' basta fazer:

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

Share this post


Link to post
Share on other sites
zecapistolas

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

Share this post


Link to post
Share on other sites
n1ckooo

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

Share this post


Link to post
Share on other sites
Baderous

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.