Ir para conteúdo
Fórum Script Brasil
  • 0

(Em C somente) Use fgets() ao invés de gets()!


bruce845

Pergunta

Muitos que estão iniciando em C usam a função gets() para ler uma string, mas ela tem os seguintes problemas (a função scanf("%s",string) quando usada para ler string têm o mesmo problema) quando a mesma é usada para ler strings...

O gets() não verifica o tamanho da string que você digitou, ou seja, se você digita mais do que o declarado em seu vetor, irá invadir memória.

Ex.:

char nome[30];
gets(nome);
Se você digitar um nome com mais de 30 caracteres, posições de memória que não pertencem ao seu programa serão invadidas. Quanto a scanf() (se usada para ler string), que também não verifica o tamanho da string e invadirá memória caso exeda o limite de caracteres, qualquer espaço digitado, ele colocará '', caracter que siginifica que a string terminou. Uma função (usada em arquivo) que não deixa NADA disso acontecer é a fgets(), onde se for exedido o limite de caracteres, ele não invadirá a sua memória! Uso da fgets: fgets(string,tamanho da string,stdin) (quanto à stdin, apenas inclua a palavra!) O incoveniente dessa função é que ela coloca também no final da string, antes de colocar o '\ 0' (dei um espaço para aparecer, o '\ 0' não estava aparecendo, mas ele não existe), o '\n' (pula linha), aí você terá que sempre fazer o seguinte para remover o '\n' da string:
if(string[strlen(string)-1]=='\n')
{
  string[strlen(string)-1]='\ 0';
}

Assim irá remover o '\n' da string!

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
Você pode usar o scanf também:

scanf("%20[^\n]s", frase);
20 - aceita apenas 20 caracteres 19 + ascii 0(terminador nulo) ^\n aceita todos os caracteres menos enter.
Infelizmente não dá pra definir o número de caracteres a serem lidos pela scanf no define. Ex.:
#define MAX_NOME 20
scanf("%MAX_NOME[^\n]s", frase); // Não adianta!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...