Função boa para ler string em C
Publicado por Elgio Schlemer (última atualização em 16/01/2010)
[ Hits: 45.458 ]
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.
*/
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como impedir exclusão de arquivos por outros usuários no (Linux)
Cirurgia no Linux Mint em HD Externo via USB
Anúncio do meu script de Pós-Instalação do Ubuntu
Alguém executou um rm e quase mata a Pixar! (5)
Formas seguras de instalar Debian Sid (4)
Duas Pasta Pessoal Aparecendo no Ubuntu 24.04.3 LTS (12)
Alguém pode me indicar um designer freelancer? [RESOLVIDO] (5)
Por que passar nas disciplinas da faculdade é ruim e ser reprovado é b... (6)









