Função boa para ler string em C
Publicado por Elgio Schlemer (última atualização em 16/01/2010)
[ Hits: 45.427 ]
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.
*/
Integração numérica - Método da Quadratura Gaussiana
Shadow Mapping utilizando OpenGL e Cg
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
Adicionar botão "mostrar área de trabalho" no Zorin OS
Como montar um servidor de backup no linux
Trazendo de volta o Serviços em Segundo Plano no Plasma6
É normal não gostar de KDE? (21)
Servidor para arquivos e banco de dados (4)
780 mil usuários do Janelas baIxaram Linux em um mês (4)
Atualizei meu ubuntu e desliguei e ele não inicia corretamente (12)









