Função boa para ler string em C
Publicado por Elgio Schlemer (última atualização em 16/01/2010)
[ Hits: 45.145 ]
Homepage: https://profelgio.duckdns.org/~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. */
Patch para Zsnes 1.51 com GCC>=4.3
Binário para Decimal, Hexa, Char
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Como colorir os logs do terminal com ccze
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado