Ir ao conteúdo

Problema com função gets [Resolvido]


TiagoGR

Posts recomendados

Postado

Eu fiz um programa que simula uma agenda em linguagem C.

Ele usa uma biblioteca que eu criei com as principais funções que ele iria utilizar.

No entanto, ao executar o programa, ele acaba ignorando alguns "gets", simplesmente indo para o próximo comando, como se o "gets" não estivesse lá.

Alguém saberia o que há de errado?

Obs1.: Me falaram que seria problema com o buffer do teclado, então eu usei a __fpurge e a fflush. Ambas não solucionaram o problema.

Obs2.: Eu tentei utilizar "scanf", "getc" e "getchar" no lugar de "gets", mas acabei esbarrando no mesmo problema.

Obs3.: O programa é executado em um Linux, com o compilador GCC (infelizmente o computador é da universidade e eu não sei exatamente a versão do GCC).


include <string.h>
#include <stdlib.h>
#include <stdio_ext.h>

char lixo[100];

int Alterar(int size)
{
struct contato
{
char nome[100];
int telefone;
char email[100];
char address[100];
char comment[100];
}compare3;

char tobealtered[100];
FILE *agenda;
agenda = fopen ("/home/aluno/Área de Trabalho/agenda.bin", "wb");

printf ("\nDigite o nome do contato que deseja alterar (maiusculas e minusculas sao diferenciadas): ");
__fpurge(stdin);
gets (tobealtered);

printf ("\n\nQual informacao deseja alterar?\n");
printf ("\nNome----------------Digite [1]");
printf ("\nTelefone------------Digite [2]");
printf ("\nE-mail--------------Digite [3]");
printf ("\nEndereço------------Digite [4]");
printf ("\nAnotacoes-----------Digite [5]\n\n");

int opcao;
__fpurge(stdin);
scanf ("%d", &opcao);

while ((opcao < 1)||(opcao > 5))
{
printf ("\n\nInsira opcao valida!\n\n");
__fpurge(stdin);
scanf ("%d", &opcao);
}

int auxiliar7 = 0;
int auxiliar8 = 0;

fseek (agenda, 0, SEEK_SET);

fread (&compare3, size, 1, agenda);

if (!(feof(agenda)))
{printf("\nContato nao encontrado");
fclose(agenda);}

else
{fseek (agenda, 0, SEEK_SET);

while (strcmp (compare3.nome, tobealtered))
{auxiliar7++;
fread (&compare3, size, 1, agenda);}

FILE *temporary;
temporary = fopen ("/home/aluno/Área de Trabalho/temp.bin", "wb");
fseek (temporary, 0, SEEK_SET);

while (auxiliar8 < auxiliar7)
{fread (&compare3, size, 1, agenda);
fwrite (&compare3, size, 1, temporary);
auxiliar8++;}

fread (&compare3, size, 1, agenda);

char newsomething[100];
int newphone;

printf ("Digite a nova informacao: ");
switch (opcao)
{ case 1:
__fpurge(stdin);
gets (newsomething);
strcpy (compare3.nome, newsomething);
case 2:
__fpurge(stdin);
scanf ("%d", &newphone);
compare3.telefone = newphone;
case 3:
__fpurge(stdin);
gets (newsomething);
strcpy (compare3.email, newsomething);
case 4:
__fpurge(stdin);
gets (newsomething);
strcpy (compare3.address, newsomething);
case 5:
__fpurge(stdin);
gets (newsomething);
strcpy (compare3.comment, newsomething);}

fwrite (&compare3, size, 1, temporary);

while (feof(agenda))
{fread (&compare3, size, 1, agenda);
fwrite (&compare3, size, 1, temporary);}

fclose(temporary);
fclose(agenda);
remove("/home/aluno/Área de Trabalho/agenda.bin");

agenda = fopen ("/home/aluno/Área de Trabalho/agenda.bin", "wb");
temporary = fopen ("/home/aluno/Área de Trabalho/temp.bin", "rb");
fseek (agenda, 0, SEEK_SET);
fseek (temporary, 0, SEEK_SET);

while (feof(temporary))
{fread (&compare3, size, 1, temporary);
fwrite (&compare3, size, 1, agenda);}

fclose(temporary);
fclose(agenda);
remove("/home/aluno/Área de Trabalho/temp.bin");

printf ("\nDados alterados com sucesso (obs.: nao ha necessidade de salvar manualmente dados alterados)");}

return 0;
}

(esta é somente uma das funções da biblioteca que apresenta o problema).

Postado

http://en.wikipedia.org/wiki/Gets

Use of gets is strongly discouraged. It is left in the C89 and C99 standards for backward compatibility (but officially deprecated in late revisions of C99). Many development tools such as GNU ld emit warnings when code using gets is linked.

"O uso do gets não é recomendado. Ele foi deixado no padrão C89 e C99 (versões do C) apenas por questões de compatibilidade com versões antigas. Várias ferramentas de desenvolvimento como o GNU Linker emitem avisos quando o código linkado usa o gets".

...

O que acontece é que o gets deixa escapar o caractere de quando você dá um ENTER pra entrar com a informação. Esse enter fica no buffer e acaba indo pra próxima variável que você tá tentando pegar.

Usa a função fgets() que é mais recomendada.

Outro "truque" que as vezes funciona é colocar um scanf logo depois do gets problemático:

gets(string); // pega uma string, mas deixa lixo no buffer

scanf("%*s"); // recebe o lixo e descarta ele

Postado

Depois de alguns testes vi que o problema não era propriamente com a função "gets" e sim com a "scanf". Era ela que estava usando o buffer do teclado. Eu usei a seguinte linha de comando para resolver isso:

while (getchar != '/n');

Coloquei isso aí depois de todos os meus "scanf" e deu certo =P

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!