Ir para conteúdo

POWERED BY:

Arquivado

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

dmer

[Resolvido] Problema com fgets()

Recommended Posts

Ele de alguma forma não funciona fora do main() oO a seguir um exemplo dele funcionando seria

#include <stdio.h>
#include <stdlib.h>
main () {
  char string1[20];
  printf("entre string :");
  fgets(string1,sizeof(string1),stdin);
  printf("eu peguei %s",string1);
  }
--

+ quando eu coloco ele dentro de 1 função sem ser o main() ele simplesmente ignora

o fgets

exemplo

void qualquercoisa() { char pegarfgets[30]; 
								 printf("teste pegar fget:");
								 fgets(pegarfgets,sizeof(pegarfgets),stdin);
																 printf("eu peguei %s",pegarfgets);
}
ele simplesmente cai pra shell sem pegar o fgets alguma dica ficaria grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como a função eh chamada?

 

O buffer pode conter sujeira. Quem sabe algum "enter".

 

Tente limpar o buffer antes de usar fgets.

 

 

Vou testar aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem a ver com estar dentro ou fora do main.

 

Breakpoint 1, main() at fgets-teste.c:10

10 fgets(buf,sizeof(buf),stdin);

19: stdin[0] = {_flags = -72540024, _IO_read_ptr = 0xb7f71004 "e\n", _IO_read_end = 0xb7f71006 "", _IO_read_base = 0xb7f71000 "teste\n" , _IO_write_base = 0xb7f71000 "teste\n" , _IO_write_ptr = 0xb7f71000 "teste\n" , _IO_write_end = 0xb7f71000 "teste\n" , _IO_buf_base =0xb7f71000 "teste\n" , _IO_buf_end = 0xb7f71400 "teste\n" , _IO_save_base = 0x0, ....}

1: buf = "test"

(gdb) s

(gdb) s

19: stdin[0] = {_flags = -72540024, _IO_read_ptr = 0xb7f71006 "", _IO_read_end = 0xb7f71006 "", _IO_read_base = 0xb7f71000 "teste\n" , _IO_write_base = 0xb7f71000 "teste\n" , _IO_write_ptr = 0xb7f71000 "teste\n" , _IO_write_end = 0xb7f71000 "teste\n" , _IO_buf_base =0xb7f71000 "teste\n" , _IO_buf_end = 0xb7f71400 "" , _IO_save_base = 0x0, ....}

1: buf = "e\n\000t"

 

Não entendo de buffers,mas parece que a chamada pro fgets é bloqueante: ele lê até que o buffer fique vazio e só depois pede mais dados.

 

Não adianta usar a gambi mais ensinada de todos os tempos (fflush) porque você está mexendo com stdIN e não stdOUT.

 

#include <stdio.h>
int main() {
 char buf[5],c;
 fgets(buf,sizeof(buf)+1,stdin);
 printf("1a leitura:%s\n",buf);
 while((c=fgetc(stdin))!=EOF && c!='\n');
 fgets(buf,sizeof(buf)+1,stdin);
 printf("2a leitura:%s\n",buf);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testei no dev aqui e funciona normalmente.

Antes da chamada da função tem alguma entrada do usuário?

 

O buffer pode influenciar sim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já que voces insistem vou explicar o porque o buffer influencia.

Não estou pedindo pra limpar o buffer com fflush.

Em nenhum momento citei o fflush.

 

 

Testem o seguinte:

 

#include <stdio.h>
#include <stdlib.h>

void qualquercoisa(void); 

main () {
  char string1[20];
  printf("entre string :");
  //fgets(string1,sizeof(string1),stdin);
  scanf("%s", string1);
  printf("eu peguei %s\n",string1);
  qualquercoisa();
  }

void qualquercoisa() { char pegarfgets[30];
								 printf("teste pegar fget:");
								 fgets(pegarfgets,sizeof(pegarfgets),stdin);
																 printf("eu peguei %s",pegarfgets);
}

O que acontece nesse caso é que scanf não armazena o \n na variável, que fica "perdido" no buffer.

Quando fgets é executada logo recebe um \n e finaliza sua execução. Por isso de alguma forma esse buffer deve ser limpo.

Seja usando fgets no lugar de scanf, seja usando um getchar(), seja usando _fpurge.

 

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já que voces insistem vou explicar o porque o buffer influencia.

Não estou pedindo pra limpar o buffer com fflush.

Em nenhum momento citei o fflush.

 

 

Testem o seguinte:

 

#include <stdio.h>
#include <stdlib.h>

void qualquercoisa(void); 

main () {
  char string1[20];
  printf("entre string :");
  //fgets(string1,sizeof(string1),stdin);
  scanf("%s", string1);
  printf("eu peguei %s\n",string1);
  qualquercoisa();
  }

void qualquercoisa() { char pegarfgets[30]; int resultvariavel;
								 printf("teste pegar fget:");

								 fgets(pegarfgets,sizeof(pegarfgets),stdin);
																 printf("eu peguei %s",pegarfgets);
}

O que acontece nesse caso é que scanf não armazena o \n na variável, que fica "perdido" no buffer.

Quando fgets é executada logo recebe um \n e finaliza sua execução. Por isso de alguma forma esse buffer deve ser limpo.

Seja usando fgets no lugar de scanf, seja usando um getchar(), seja usando _fpurge.

 

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

--

Eu concordo tem algo enfiando coisa no char ... por causa do \n ou sem mesma coisa

teste assim

#include <stdio.h>
#include <stdlib.h>

void qualquercoisa(void);

main () {
  char string1[20];
  printf("entre string :");
  //fgets(string1,sizeof(string1),stdin);
  scanf("%s", string1);
  printf("eu peguei %s\n",string1);
  qualquercoisa();
  }

void qualquercoisa() { char pegarfgets[30]; int resultvariavel;
						printf("teste pegar fget:");
						 fgets(pegarfgets,sizeof(pegarfgets),stdin);
						 resultvariavel = strlen(pegarfgets);
				printf("peguei %s\n e ele tem %u\n",pegarfgets,resultvariavel);
ele retorna 1 no int

 

 

no caso seria entao o que fflush(pegarfgets); antes dele ser usado pelo fgets() ? grato

Compartilhar este post


Link para o post
Compartilhar em outros sites
Apesar de não recomendarem ele retira o "lixo" do buffer.

 

#include <stdio.h>
#include <string.h>
int main() {
 char buf[5],c;
 fgets(buf,sizeof(buf),stdin);
 fflush(stdin);
 fgets(buf,sizeof(buf),stdin);
 printf("%s\n",buf);
}

 

Saída:

 

isis@nowhere:~/src/CPP> ./a.out

teste 1 primeiro fgets

e 1 resto do buffer

 

isis@nowhere:~/src/CPP> ./a.out

abc

123

123

 

isis@nowhere:~/src/CPP>

 

 

 

Tirando o fflush do código:

 

isis@nowhere:~/src/CPP> ./a.out

lin

123

123

 

isis@nowhere:~/src/CPP> ./a.out

teste 1

e 1

 

isis@nowhere:~/src/CPP>

 

 

Tentar fflush(NULL) também não faz nada. O único "flush" que vi fazer alguma coisa foi esse:

 

#include <stdio.h>
#include <stdio_ext.h>
int main() {
 char buf[5],c;
 fgets(buf,sizeof(buf),stdin);
 __fpurge(stdin);
 fgets(buf,sizeof(buf),stdin);
 printf("%s\n",buf);
}

 

Saída:

 

isis@nowhere:~/src/CPP> ./a.out

linha comprida

linha 2 com numeros 123623896

linh

isis@nowhere:~/src/CPP>

 

The function fpurge() clears the buffers of the given stream. For output streams this discards any unwritten output. For input streams this discards any input read from the underlying object but not yet obtained via getc(3);this includes any text pushed back via ungetc(3).

 

O fflush não tem influência nessa história de fgets e stdin.É mais coisa de dimensionar o tamanho do buffer. Dá uma olhada nisso:

 

#include <stdio.h>
int main() {
 char buf[5],c;
 setbuffer(stdin,buf,sizeof(buf)-1);
 fgets(buf,sizeof(buf),stdin);
 fgets(buf,sizeof(buf),stdin);
 printf("%s\n",buf);
}

 

A saída é a mesma do que sem o setbuffer. Se você fizer

 

#include <stdio.h>
int main() {
 char buf[5],c;
 buf[5] = '\0';

 fgets(buf,sizeof(buf),stdin);
 setbuffer(stdin,buf,sizeof(buf));
 fgets(buf,sizeof(buf),stdin);
 printf("%s\n",buf);
}

 

O que sobrar no buffer vai ser jogado pro terminal automaticamente.

 

 

http://www.gidforums.com/t-14482.html

Using fflush(stdin). This function is not appropriate for reasons mentioned

Using rewind(stdin). This function is not appropriate as it is not intended to be used for buffer clearing.

 

The use of buffer clearing code may have been avoided with gets() or scanf() for scanning string input. These functions are not safe because they do not check for the amount of input being accepted.

 

http://biangaucho.com.br/limpar-buffer-teclado-c

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao.Nao faz.Só ler o manual:

 

These functions are nonstandard and not portable.The function fpurge() was introduced in 4.4BSD and is not available under Linux.The function __fpurge() was introduced in Solaris and is present in glibc 2.1.95 and later.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste o código todo.

Só assim poderemos afirmar alguma coisa.

 

sim tentei isso e continua não pegando o fgets() vai entender isso viu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste o código todo.

Só assim poderemos afirmar alguma coisa.

 

sim tentei isso e continua não pegando o fgets() vai entender isso viu

o código todo de um programa de 5000 linhas ? desnecessário amigo apenas recriei a situação e já esta colado em posts acima

veja a parte no qual o fgets da erro

#include <stdio.h>
#include <stdlib.h>

void qualquercoisa(void);

main () {
  char string1[20];
  printf("entre string :");
  //fgets(string1,sizeof(string1),stdin);
  scanf("%s", string1);
  printf("eu peguei %s\n",string1);
  qualquercoisa();
  }

void qualquercoisa() { char pegarfgets[30]; int resultvariavel;
						printf("teste pegar fget:");
						fflush(stdin);
						 fgets(pegarfgets,30,stdin);
						 resultvariavel = strlen(pegarfgets);
				printf("peguei %s\n e ele tem %u\n",pegarfgets,resultvariavel);
nesse código em questão mostra o problema que estou tendo o fgets() sendo usado dentro de uma função qualquer ele simplesmente ignora o fgets() quando a função é executada porque de alguma forma o char pegarfgets contem lixo .. o mais interessante é o seguinte se eu pegar essa função e remover ela toda deixando ela dentro do main() apenas ele funciona sem problema algum. Como no exemplo abaixo

#include <stdio.h>
#include <stdlib.h>
main () {
  char string1[20];
  printf("entre 2 strings :");
  fgets(string1,sizeof(string1),stdin);
  printf("eu peguei %s",string1);
  }

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa to meio pegando isso do meio, aki rodo legal codigo do seu ultimo post!

oq qr realmente?

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa to meio pegando isso do meio, aki rodo legal codigo do seu ultimo post!

oq qr realmente?

 

[]'s

O problema é o fgets() dentro da função qualquercoisa() que de alguma forma ele não é executado simplesmente recebe 1 lixo qualquer da string e sai sem esperar que o usuário digite algo pode testar

--

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara testei aqui e funcionou legal o seu código. Qual compilador você usa?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara testei aqui e funcionou legal o seu código. Qual compilador você usa?

Using built-in specs.

Configured with: FreeBSD/i386 system compiler

Thread model: posix

gcc version 3.4.6 [FreeBSD] 20060305

 

--

Sim ele roda normal o problema é que o fgets() estava pegando lixo e também já achei a solução p/ quem estava rancando cabelo que nem eu

aplique essa func()

limparlixo() {
  int ch;

	do
		ch = getchar();
		  while (ch != EOF && ch != '\n');

			clearerr(stdin);
}
faca ela ser executada antes do fgets() dentro da função e pronto fgets() funciona finalmente bom obrigado pelas dicas e ajudas + consegui a solução

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.