Função boa para ler string em C
Publicado por Elgio Schlemer (última atualização em 16/01/2010)
[ Hits: 45.045 ]
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. */
Programa para cálculo vetorial
Integração numérica - Método da Quadratura Gaussiana
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (14)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)