comando fgets

1. comando fgets

Andre
x-andré

(usa Ubuntu)

Enviado em 10/12/2008 - 20:35h

SOCORRO!!!...

Estou fazendo um programa que precise armazenar uma string de 30 caracteres. e so aceite 30, que os proximos dados a serem digitados caiam no proximo comando.
O interessante eh... do jeito que esta ele roda...
mais se eu colocar qualquer comando que seja como um scanf, antes do fgets, ele ja nao funciona =/
estranho nao???....

até agora ele esta assim...

#include<stdio.h>
#include<string.h>
#define MAX 30

int main(){

//int p;
//scanf("%d",&p); = se eu ativar esse comando o fgets nao funciona...

char nome[MAX];
fgets(nome, MAX, stdin);


printf("\n\n%s", nome);

return 0;
}


Pq quando eu ativo os comandos antes do fgets, ele nao funciona???
Como solucionar esse problema???
A uma funcao melhor que o fgets (sem ser o gets)???
qual????


  


2. Re: comando fgets

Gerson Martins
gersonmartins

(usa Fedora)

Enviado em 11/12/2008 - 20:38h

tente fazer isso para limpar a entrada e saida

fflush(stdin);

quando fiz isso resolveu consegui entrar com co nome, ou entao use o comando cin.getline da iostream dessa forma

cin.getline(nome, MAX, '{TTEXTO}');




3. Re: comando fgets

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 11/12/2008 - 21:07h

acontece que você precisa limpar o buffer do teclado após scanf.
scanf está capturando o \n (quando você dá o "enter" - ou ainda algum outro caractere que não numérico nesse caso) e então o mantém no buffer. qualquer chamada buferizada subseqüente irá pegar esse "lixo", resultando em comportamentos anômalos.
há algumas maneiras de contornar isso. as mais elegantes, digamos assim, é através de fflush, como citado pelo amigo aí em cima, ou por getchar, porém essa deixa seu código vulnerável e deve portanto ser evitado. outra saída, menos elegante, é capturar esses caracteres "lixo" através da própria formatação fixa:

scanf("%d%\n",&p); /* captura o line feed apenas */
ou
scanf("%d%*c",&p); /* captura qualquer caractere extra */


4. ainda nao...

Andre
x-andré

(usa Ubuntu)

Enviado em 12/12/2008 - 18:19h

nao funcionou ainda...

#include<stdio.h>
#include<string.h>
#define MAX 30

int main(){
int n, pem, ep, cont, pp, pep;
char nome[MAX];

scanf("%d", &pp);
scanf("%d ", &pep);

fflush(stdin);//===========>nao funcionou assim... =/
fgets(nome, MAX, stdin);

printf("\%s", nome);//=======>comando pra testar se armazenou realmente.

system("pause");
}
/**************************************************************/
ja tentei inverter assim tb...

fgets(nome, MAX, stdin);
fflush(stdin);
/**************************************************************/
ou migrar para o getchar:

for(cont=0; cont<30; cont++){
nome[cont]=getchar;
printf("%c", nome[cont])}
=================================================
Eu entendi, que o Buffer estava sendo utilizado, e necessita limpa-lo, mais se eu limpa-lo, nao vai sumir com os valores das minhas variaveis ja armazenadas??... (foi mal se a pergunta foi [*****], eh que estou começando agora)...

Eu quero que ele armazene um nome de até 30 caracteres e no 31 caractere digitado ja caia no proximo comando....



5. fflush

César Frias
btc_cesar

(usa Fedora)

Enviado em 13/12/2008 - 20:41h

Cara o fflush limpa apenas o que está em buffer, nao o que está salvo nas variaveis...
esse comando é usado apos cada vez que voce recebe uma string.

nao entendi pq vc quer usar as letras a mais no proximo comando, mas vc pode salvar tudo o q foi digitado em uma variavel e imprimir apenas as 30 primeiras letras e depois concatenar o restante para usar no proximo comando, nao sei se fui claro.

Qq coisa posta aqui novamente.


6. sei...

Andre
x-andré

(usa Ubuntu)

Enviado em 15/12/2008 - 16:41h

eh que eh assim...
o usuario nao vai digitar nada...
ele vai pegar os dados de um arquivo .txt
que vai ser assim

variavel[numero de notas]
variavel[numero de alunos]
variavel[numero de trabalhos]
variavel[peso das notas]
variavel[etc]

[nome do aluno de trinta caracteres] 10 8 7

/*vendo q 10 8 7 eh a nota desse aluno, entao eu tenho que armazenar o nome do aluno em uma string, pra dar um printar na tela. e o 1 numero apos o nome armazenar em outra variavel de primeira nota do aluno pra tirar a media...Deu pra intender???*/

a real... eh ki kuando eu for compilar o arquivo, vai ser pra saida em um arquivo txt tb...

# arquivo.txt<meuprograma>arquivo_com_as_medias.txt

entende?????

falow
valew


7. Re: comando fgets

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 15/12/2008 - 17:00h

tentou o que eu disse?

scanf("%d%\n",&p); /* captura o line feed apenas */
ou
scanf("%d%*c",&p); /* captura qualquer caractere extra */

testei ambas no seu código, passei até pelo gdb para ver as entranhas e foi tudo ok aqui.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts