dmer 0 Denunciar post Postado Maio 22, 2008 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
Kandrade 7 Denunciar post Postado Maio 22, 2008 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
_Isis_ 202 Denunciar post Postado Maio 22, 2008 Não tem a ver com estar dentro ou fora do main. Breakpoint 1, main() at fgets-teste.c:1010 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
Kandrade 7 Denunciar post Postado Maio 22, 2008 Não entendi. Não adianta usar a gambi mais ensinada de todos os tempos (fflush) porque você está mexendo com stdIN e não stdOUT. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Maio 22, 2008 O fflush nao vai fazer efeito nenhum em stdin. Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Maio 23, 2008 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
José Enésio 4 Denunciar post Postado Maio 23, 2008 Aqui: http://www.gidnetwork.com/b-57.html :) Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Maio 23, 2008 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
dmer 0 Denunciar post Postado Maio 23, 2008 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 Aqui: http://www.gidnetwork.com/b-57.html :) 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
Kandrade 7 Denunciar post Postado Maio 23, 2008 Pode usar fflush antes do fgets. fflush(stdin); Apesar de não recomendarem ele retira o "lixo" do buffer. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
dmer 0 Denunciar post Postado Maio 23, 2008 sim tentei isso e continua não pegando o fgets() vai entender isso viu :( Pode usar fflush antes do fgets. fflush(stdin); Apesar de não recomendarem ele retira o "lixo" do buffer. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Maio 24, 2008 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 mentionedUsing 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
Kandrade 7 Denunciar post Postado Maio 24, 2008 Falando nisso sempre usei _fpurge() no gcc. _fpurge() faz parte do ANSI C? Quase não encontro referencia dele no google. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Maio 24, 2008 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
Kandrade 7 Denunciar post Postado Maio 24, 2008 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
dmer 0 Denunciar post Postado Maio 24, 2008 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
quitZAUMMM 18 Denunciar post Postado Maio 24, 2008 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
dmer 0 Denunciar post Postado Maio 24, 2008 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
José Enésio 4 Denunciar post Postado Maio 24, 2008 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
dmer 0 Denunciar post Postado Maio 24, 2008 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