À primeira vista, parece que vai funcionar. Contudo, você pode melhora-lo um pouquinho. Pode ficar algo assim:
char nome[TAMMAX];
printf("Digite seu nome: ");
fgets(nome, TAMMAX, stdin);
printf("O tamanho do seu nome é: %lu\n", strlen(nome));
printf("Seu nome é: %s", nome);
return 0;
Você deve evitar ao máximo utilizar a função gets
. Ela é conhecida por poder ser uma falha de segurança. Você não especifica quantos characteres você quer ler, e isso é bem problemático! Imagine alguém mal intensionado coloca ali uma string maior do que o buffer que você declarou. Isso, no melhor dos casos, vai causar um erro de overflow. Porém, o que acontece, é que o sistema operacional não tem impede de escrever em posições fora do teu array. Experimente declarar um array com 5 posições, e escrever na posição 10, por exemplo.
Fiz um teste aqui:
int x[1];
x[100] = 3;
Gerou um warning quando compilei, mas rodou sem problema nenhum. E se naquela área da memória em que o 3 foi escrito estiver o conteúdo de alguma outra variável?
Por isso, você pode utilizar a função fgets
em seu lugar. Os três argumentos pra essa função são:
- O buffer pra onde deve ser lido a string (é aqui que vai ser armazenado oq você leu)
-
Quantos characters devem ser lidos
- De onde deve ser lido (stdin significa standard input, é onde você digita no terminal)
Você pode verificar o tamanho da string lida através da função strlen
. Ela nada mais faz do que iterar no array procurando o character de finalização, ou character nulo, que é o ‘\0’. Quem insere esse character no final da string do usuário é a função fgets
.
Só mais uma coisa. Imagine que você digita isso no terminal: guj
. Em seguida, lê com fgets
e imprime o tamanho da string. Vai aparecer que o tamanho é 4
, e não 3
como parece. A primeira reação é achar que está errado, mas não está. O fgets
pega o enter
que a gente aperta para dizer que terminamos de digitar. A string que vai para o buffer é: guj\n
. Se você quiser corrigir isso, pode fazer assim, depois do código que citei anteriormente:
char* letra = nome;
while (*letra != '\n') letra++;
*letra = 0;
Isso vai percorrer a string lida procurando pelo character de quebra de linha. Assim que ele for achado, é substituído pelo character nulo (0
, ou \0
). Se for chamado o strlen
no buffer nome
de novo, o resultado vai ser a contagem certa, sem quebra de linha. É uma abordagem muito simples, e está ignorando a situação onde não há quebra de linhas no buffer.