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