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:
Question
bruce845
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.:
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:Assim irá remover o '\n' da string!
Link to comment
Share on other sites
2 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.