Jump to content
Fórum Script Brasil
  • 0

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


bruce845

Question

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 to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...