Ler nomes com espaço [RESOLVIDO]

1. Ler nomes com espaço [RESOLVIDO]

Bruno Pereira De Andrade
brunopandrade

(usa Ubuntu)

Enviado em 01/12/2009 - 13:52h

Bom, uso o gcc para compilar meus programas em C no linux.
Declaro uma string exemplo: char nome[50];
Leio esta string: scanf("%s", nome);

Este último método porém me retorna somente a primeira palavra digitada caso o nome digitado contenha espaços em branco (ou seja, o scanf("%s") lê somente até o primeiro espaço em branco).

Existe alguma forma para ler os nomes compostos (nomes com espaço em branco) no gcc, alguém sabe qual função usar?

desde já agradeço!



  


2. MELHOR RESPOSTA

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 16/01/2010 - 18:07h

Publiquei a função que descrevi acima no VOL:

http://www.vivaolinux.com.br/script/Lendo-strings-em-C

3. Re: Ler nomes com espaço [RESOLVIDO]

Bruno Pereira De Andrade
brunopandrade

(usa Ubuntu)

Enviado em 01/12/2009 - 15:30h

Achei! rs

usei a função fgets para ler os nomes compostos e funcionou corretamente (o scanf abaixo é usado para ler um inteiro):


fgets(pessoas.nome, 50, stdin);

scanf("%d%*c", &pessoas[i].idade);


tive que usar este %*c no scanf, ele pega o \n digitado, se ficar sem ele o próximo fgets iria dar problema pois esse \n iria ficar no buffer.



4. Re: Ler nomes com espaço [RESOLVIDO]

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 16/01/2010 - 11:39h

Podes mudar o scanf para ler espaços SIM:

scanf("%[^\n]s", lixo);

Agora ele só para de ler com um enter.

contudo continuarás com o problema do enter que sobra.

eu escrevi um artigo para meus alunos de C sobre o scanf e abordei este problema http://www.vivaolinux.com.br/artigo/Parametros-interessantes-do-scanf-e-do-printf-em-C (capitulo 2 aborda isto), até para criticar que resolve este problema com o temerário fflush

Eu prefiro usar a minha função para ler strings que resolve TODOS os problemas (o fgets deixa um enter no fim, caso não tenha percebido).

int lestring(char s[], int max)
{
int i = 0;
char letra;

/* No caso o max eh o tamanho que s pode receber. Deve ser passado o tamanho
mesmo, ou seja, se for passado 100 a funcao jah se encarrega de nao deixar
passar de 99 cars (+1 do finalizador)
*/
for (i = 0; i < (max - 1); i++) {
letra = fgetc(stdin);

/* Veja __NOME__ que se encontrou um ENTER (\n) mas nao leu nenhum
* caractere valido, nao aceita. Precisa ler algo.
* Decrementa o i para anular o efeito do i++ do laco
* e volta no laco com continue
*/
if ((letra == '\n') && (i == 0)) {
i = i - 1;
continue;
}

/* Agora se leu um enter ja tendo lido caracteres validos, entao
* usuario terminou de digitar sua string e ela possui ao menos
* um caractere valido
*/
if (letra == '\n')
break;
s = letra;
}

/* Finaliza a string */
s[i] = 0;

/* retorna a quantidade de cars lidos (pode ser util). Entao, esta funcao
le uma string e retorna o seu tamanho
*/
return (i);
}

Chame-a assim:
t = lestring(s, 50); // como no fgets, mas sem o stdin




5. Re: Ler nomes com espaço [RESOLVIDO]

Leonam Gama da Silva
leonamtotal90

(usa Ubuntu)

Enviado em 21/01/2010 - 12:05h

Eu recomendo aprender C++. Ela possui uma funcao sem muita abstracao chamada getline similar ao gets( que por razoes particulares nao é usada no linux)
sua chama é assim:
getline(cin,"nome da variavel");


6. Ler nomes com espaço [RESOLVIDO]

Guilherme Capecci de Paula
capecci

(usa Ubuntu)

Enviado em 27/09/2012 - 10:25h

Para ler nomes compostos utilize o gets(nome);


7. Re: Ler nomes com espaço [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/09/2012 - 18:53h

capecci escreveu:

Para ler nomes compostos utilize o gets(nome);


gets é uma função tão "boa" que foi REMOVIDA no último padrão do C.

Em outras palavras, NUNCA a use.


8. Re: Ler nomes com espaço [RESOLVIDO]

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 27/09/2012 - 18:55h

capecci escreveu:

Para ler nomes compostos utilize o gets(nome);


Em nome da segurança: esqueça que uma vez existiu o gets().

Nunca, jamais o use!!

O porque está neste mesmo forum, nas respostas anteriores.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts