Função boa para ler string em C
Publicado por Elgio Schlemer (última atualização em 16/01/2010)
[ Hits: 45.110 ]
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. */
Binário para Decimal, Hexa, Char
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Título: Descobrindo o IP externo da VPN no Linux
Armazenando a senha de sua carteira Bitcoin de forma segura no Linux
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
Máquinas Virtuais com IP estático acessando Internet no Virtualbox
Instalar o Microsoft Edge no Slackware 15
Instalando Brave Browser no Linux Mint 22
vídeo pra quem quer saber como funciona Proteção de Memória:
crontab executar em tempos (1)
Formatando cartão de memoria que nao formata[AJUDA] (9)
Programa duplicado no "Abrir com" e na barra de pesquisa do ... (3)