Função boa para ler string em C
Publicado por Elgio Schlemer (última atualização em 16/01/2010)
[ Hits: 45.253 ]
Homepage: http://profelgio.duckdns.org:8080/~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. */
Divisores de um inteiro positivo em C++
Conhecendo atributos do Ncurses
Aprenda a Gerenciar Permissões de Arquivos no Linux
Como transformar um áudio em vídeo com efeito de forma de onda (wave form)
Como aprovar Pull Requests em seu repositório Github via linha de comando
Visualizar arquivos em formato markdown (ex.: README.md) pelo terminal
Dando - teoricamente - um gás no Gnome-Shell do Arch Linux
Como instalar o Google Cloud CLI no Ubuntu/Debian
Mantenha seu Sistema Leve e Rápido com a Limpeza do APT!
Procurando vídeos de YouTube pelo terminal e assistindo via mpv (2025)
O que você está ouvindo agora? [2] (183)
Gestão de Ambiente em uma rede Linux (2)
Ajuda Pra Melhoria do NFTABLES. (7)
Zorin OS - Virtual Box não consigo abrir maquinas virtuais (4)