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");
}
[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 <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'.
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.