Pular para o conteúdo

Melhor Controle de Memória de Strings em C

Dica publicada em C/C++ / Introdução
Mauricio Ferrari (LinuxProativo) maurixnovatrento
Hits: 2.575 Categoria: C/C++ Subcategoria: Introdução
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Melhor Controle de Memória de Strings em C

Se você está começando a programar em C, não deixe essa dica passar. Ao fazer um curso no Udemy sobre Linguagem C e C++, aprendi uma expressão para limpar os espaços alocados não utilizados na memória.

Você irá usar a expressão após gravar uma string. Veja a expressão:

palavra[strlen(palavra)-1] = '\0';

Para testar, você pode usar esse exemplo:

#include <stdio.h>
#include <stdlib.h>

void main(){
    char exemplo[10];
    printf("Digite uma palavra com menos de 10 digitos");
    setbuf(stdin, 0);
    fgets(exemplo, 10, stdin);

    exemplo[strlen(exemplo)-1] = '\0'; /** A função para limpar os espaços vazios. **/

    printf("%s", exemplo);
    system("pause");
}

Fica aí a dica.

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Instalando Última Versão do LibreOffice no Deepin 20

Como Criar e Aplicar um Patch de Correção de Código

UMPlayer no Debian Ubuntu e Linux Mint

Erro: "Não foi possível localizar o arquivo solicitado. Por favor verifique a grafia" [Resolvido]

Resetando as configurações do mate-terminal

Exibindo código ASCII das teclas

Ocorrência de uma string em outra

Fatorial usando recursividade

Compilando no Code::Blocks

Incluindo paths para os seu próprios headers

#2 Comentário enviado por sallesricardo em 19/05/2020 - 00:22h
Mauricio, desculpe a intromissão, mas eu tenho algumas considerações a fazer.

Pra começar, nunca faça 'fgets(exemplo, 255, stdin);" a não ser que você tenha declarado a variável exemplo com tamanho 255. Do jeito que está, se o usuário digitar mais que 9 caracteres, o fgets vai colocar esses caracteres numa posição de memória não reservada para a sua variável e sobrescrever outra variável do seu programa causando resultados imprevistos na sua lógica, ou causando a falha de segmentation fault no seu programa que é gerado quando o seu programa tenta usar uma região de memória que não foi reservada para o seu programa pelo kernel do seu sistema operacional.

A função strlen retorna o tamanho da string que é a posição do caractere '\0' ou nulo. Então, se sua já tem o caractere '\0' no final dela, não há necessidade de fazer "exemplo[strlen(exemplo)-1] = '\0';", porque essa parte está colocando o caractere nulo onde já tem um caractere nulo.

Uma boa pratica para garantir que você tenha '\0' no restante do seu vetor mesmo que você não tenha certeza que a função que você esta usando já coloque o '\0' no final da string, é usando a função "memset(exemplo, '\0', 10);" da biblioteca <string.h>. A função memset recebe como parametros, 1º o vetor a ser setado, 2º o caractere que vai ser setado em todo o vetor, 3º a quantidade de vezes. No exemplo a variavel exemplo terá as 10 posições com o valor '\0'.
#3 Comentário enviado por maurixnovatrento em 20/05/2020 - 18:51h

[2] Comentário enviado por sallesricardo em 19/05/2020 - 00:22h

Mauricio, desculpe a intromissão, mas eu tenho algumas considerações a fazer.

Pra começar, nunca faça 'fgets(exemplo, 255, stdin);" a não ser que você tenha declarado a variável exemplo com tamanho 255. Do jeito que está, se o usuário digitar mais que 9 caracteres, o fgets vai colocar esses caracteres numa posição de memória não reservada para a sua variável e sobrescrever outra variável do seu programa causando resultados imprevistos na sua lógica, ou causando a falha de segmentation fault no seu programa que é gerado quando o seu programa tenta usar uma região de memória que não foi reservada para o seu programa pelo kernel do seu sistema operacional.

A função strlen retorna o tamanho da string que é a posição do caractere '\0' ou nulo. Então, se sua já tem o caractere '\0' no final dela, não há necessidade de fazer "exemplo[strlen(exemplo)-1] = '\0';", porque essa parte está colocando o caractere nulo onde já tem um caractere nulo.

Uma boa pratica para garantir que você tenha '\0' no restante do seu vetor mesmo que você não tenha certeza que a função que você esta usando já coloque o '\0' no final da string, é usando a função "memset(exemplo, '\0', 10);" da biblioteca &lt;string.h&gt;. A função memset recebe como parametros, 1º o vetor a ser setado, 2º o caractere que vai ser setado em todo o vetor, 3º a quantidade de vezes. No exemplo a variavel exemplo terá as 10 posições com o valor '\0'.



Também percebi, foi um erro meu na hora de montar o exemplo. Eu tenho um artigo no meu site sobre isso, só que com o código corrigido. É que no dia em que eu fiz a dica não percebi o erro.
#4 Comentário enviado por maurixnovatrento em 02/06/2020 - 23:09h

fgets(exemplo, 255, stdin);

Correção feita.

___________________________________
Conhecimento não se Leva para o Túmulo.

Contribuir com comentário

Entre na sua conta para comentar.