Função boa para ler string em C
Publicado por Elgio Schlemer (última atualização em 16/01/2010)
[ Hits: 45.386 ]
Homepage: https://elgio.prof.nom.br/~elgio
Muitos tem certa dificuldade em ler strings em C, principalmente se usar o scanf, que não lê espaços em branco em sua forma original. Um artigo meu em http://www.vivaolinux.com.br/artigo/Parametros-interessantes-do-scanf-e-do-printf-em-C descreveu um pouco deste problema e aqui publico uma função em C que resolve estes problemas.
/*
TÍTULO: Função boa para ler strings
Uma função boa para ler strings que resolve o problema que o fflush resolveria
A técnica é não aceitar string vazia.
Deve ser passada a string e o tamanho máximo
A função NÃO DEIXA digitar mais do que o tamanho máximo e o que exceder este tamanho
NÃO SERÁ LIDO, ficando para a próxima função que realizar alguma leitura
*/
#include <stdio.h>
int lestring(char s[], int max)
{
int i = 0;
char letra;
/* No caso o max é o tamanho que s pode receber. Deve ser passado o tamanho
mesmo, ou seja, se for passado 100 a função já se encarrega de não deixar
passar de 99 cars (+1 do finalizador)
*/
for (i = 0; i < (max - 1); i++) {
letra = fgetc(stdin);
/* Veja que se encontrou um ENTER (\n) mas não leu nenhum caractere válido,
* não aceita. Precisa ler algo. Decrementa o i para anular o efeito do i++
* do laço e volta no laço com continue
*/
if ((letra == '\n') && (i == 0)) {
i = i - 1;
continue;
}
/* Agora se leu um enter já tendo lido caracteres válidos, então
* o usuário terminou de digitar sua string e ela possui ao menos
* um caractere válido
*/
if (letra == '\n')
break;
s[i] = letra;
}
/* Finaliza a string */
s[i] = 0;
/* retorna a quantidade de cars lidos (pode ser útil). Então, esta função
lê uma string e retorna o seu tamanho
*/
return (i);
}
// Exemplo de uso da lestring:
/* Dentro do main... */
#define MAXSTR 20
int main()
{
char s[MAXSTR];
int t;
t = lestring(s, MAXSTR);
printf("Você digitou %s\n", s);
printf("E esta string tem %i cars\n", t);
return (0);
}
/* Com esta função não precisa usar o fflush. Ela lê espaços em branco e não mais do
* que a capacidade da string. Muito melhor que o scanf, pois em sua versão original
* não lê espacos. Melhor que o gets, pois o gets, assim como scanf, permite INVADIR
* a string (overflow). Melhor que o fgets, pois não precisa limpar o buffer do
* teclado com fflush.
*/
Contagem de elementos de um array
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
E aí? O Warsaw já está funcionando no Debian 13? [RESOLVIDO] (15)
Secure boot, artigo interessante, nada técnico. (4)
copiar library para diretorio /usr/share/..... su com Falha na a... (1)









