Discussion:
Problema con el buffer de entrada?
(demasiado antiguo para responder)
Jorge S. de Lis
2006-04-30 00:33:01 UTC
Permalink
Buenas lista.

Tengo unos problemas obteniendo cadenas de texto de teclado.

Anteriormente a esto pido un entero con scanf("%i",&var); y a partir de
entonces al leer una cadena lee el salto de linea anterior y ni siquiera
espera para pedir por teclado. El gdb me dice esto antes y después de que
pida la cadena:

$1 = "H£Â¿Þ\203\004\b`\023DD`\235\004\bX£Â¿!"
$2 = "\n\000¿Þ\203\004\b`\023DD`\235\004\bX£Â¿!"

La historia es que no consigo nada, ni cambiando el método de leer el entero
ni leyendo un caracter en su lugar, ni tampoco usando otros métodos para
leer la cadena. Únicamente con scanf, pero éste no me sirve porque se para
en el primer espacio que encuentra.

He probado a usar fflush(stdin) y fflush(NULL) pero parecen no tener efecto.

Creo que necesito ayuda urgente sobre algo básico que se me está escapando.

Muchas gracias de antemano.
arrase
2006-04-30 19:49:19 UTC
Permalink
Ver algo del codigo ayudaria :)

Saludos.
--
<***@gulcas.org><http://arrase.no-ip.org><www.gulcas.org>
<Gnupg Keys: http://arrase.no-ip.org/pubkey.txt>

print "".join(map(lambda numChar:filter(lambda x:(x<"0") or \
(x>"9"),numChar),["0"+chr(104)+"0","1"+chr(111)+"1","2"+chr(108)+"2", \
"3"+chr(97)+"3","4"+chr(32)+"4","5"+chr(109)+"5","6"+chr(117)+"6", \
"7"+chr(110)+"7","8"+chr(100)+"8","9"+chr(111)+"9"]))
heltena
2006-05-01 09:26:28 UTC
Permalink
a mi me va:

#include <stdio.h>

int main(int argc, char* argv[])
{
int value;
char salir;

printf("escribe enteros: ");
salir = 0;
while (!salir)
{
if (1 != scanf("%d", &value))
{
fprintf(stderr, "No has escrito un numero!!!\n");
salir = 1;
}
else if (0 == value)
{
salir = 1;
}
else
{
printf("Has escrito '%d'\n", value);
}
}
return 0;
}
arrase
2006-05-01 19:54:17 UTC
Permalink
Segun entiendo yo, lo que no puedes hacer es leer un entero y luego una
cadena por que te falla al hacerlo de alguna de estas maneras:

#include <stdio.h>

int main()
{
int num;
char cadena[20];

printf("Numero:");
scanf("%d", &num);

printf("Cadena:");
scanf("%s",cadena);

printf("\nNumero=%d\nCadena=%s\n\n",num,cadena);

printf("Numero y Cadena (con un espacio entre ellos):");
scanf("%d %s", &num,cadena);

printf("\nNumero=%d\nCadena=%s\n",num,cadena);
}

Saludos.
--
<***@gulcas.org><http://arrase.no-ip.org><www.gulcas.org>
<Gnupg Keys: http://arrase.no-ip.org/pubkey.txt>

print "".join(map(lambda numChar:filter(lambda x:(x<"0") or \
(x>"9"),numChar),["0"+chr(104)+"0","1"+chr(111)+"1","2"+chr(108)+"2", \
"3"+chr(97)+"3","4"+chr(32)+"4","5"+chr(109)+"5","6"+chr(117)+"6", \
"7"+chr(110)+"7","8"+chr(100)+"8","9"+chr(111)+"9"]))
Jorge S. de Lis
2006-05-02 23:28:24 UTC
Permalink
...
Vaya, siento no haber puesto ejemplos. Gracias por vuestras aportaciones,
pero creo que lo entenderéis mejor si os pongo un poco de código como habéis
sugerido.

#include <stdio.h>

int main(void){
int a;
char b[20];

scanf("%d",&a);

fgets(b,20,stdin); // se lo salta por el intro del scanf anterior

return 0;
}


Si con scanf("%s",b); funciona, pero no me sirve porque se para en el primer
espacio, y necesito leer una cadena con espacios.

Igualmente, insertando un fflush(stdin); antes del fgets no hace nada.


#include <stdio.h>

int main(void){
int a;
char b[20];

scanf("%d",&a);
fflush(stdin); // no hace nada
fgets(b,20,stdin); // se lo salta por el intro del scanf anterior

return 0;
}

También ocurre con gets y demás funciones de la familia *get*. He probado a
utilizar una función propia que utiliza getchar y va reservando memoria
dinámicamente y me ocurre lo mismo.

La única solución que he encontrado es usar un getchar antes de recoger la
cadena, pero no me parece elegante. ¿No hay ninguna forma de descartar el
buffer de entrada sea cual sea? Estar pendiente de si hay un intro o no, o
usar siempre un getchar después de cada llamada a scanf que lea números no
me parece normal.

#include <stdio.h>

int main(void){
int a;
char b[20];

scanf("%d",&a);
getchar(); // recoge el intro, hace que funcione_
// pero me parece una guarrada.
fgets(b,20,stdin); // se lo salta por el intro del scanf anterior

return 0;
}

Si bien es cierto que con un define la cosa queda más o menos elegante y me
olvido, pero no es lo que busco exactamente...


#include <stdio.h>
#define scanf(Yd,X) scanf(Yd,X);getchar()

int main(void){
int a;
char b[20];

scanf("%d",&a);

fgets(b,20,stdin); // se lo salta por el intro del scanf anterior

return 0;
}


Gracias.

Saludos.
heltena
2006-05-03 07:34:40 UTC
Permalink
#include <stdio.h>

int main()
{
int a;
char b[20];

scanf("%d\n", &a); /* ponle aqui que quieres leer un \n */
fgets(b, 20, stdin);

printf("Has escrito: %d '%s'\n", a, b);
return 0;
}
arrase
2006-05-03 15:23:10 UTC
Permalink
Post by Jorge S. de Lis
Si bien es cierto que con un define la cosa queda más o menos elegante y me
olvido, pero no es lo que busco exactamente...
#include <stdio.h>
#define scanf(Yd,X) scanf(Yd,X);getchar()
int main(void){
int a;
char b[20];
scanf("%d",&a);
fgets(b,20,stdin); // se lo salta por el intro del scanf anterior
return 0;
}
Gracias.
Saludos.
Eso de elegante no tiene nada :).

La solucion es simple, te falta un espacio en blanco despues de leer el
entero, es una pequeña puñeta de C pero mira, es asi :):

#include <stdio.h>

int main(void){
int a;
char b[20];

scanf("%d ",&a);

fgets(b,20,stdin); // se lo salta por el intro del scanf anterior

printf("%d %s",a,b);

return 0;
}
--
<***@gulcas.org><http://arrase.no-ip.org><www.gulcas.org>
<Gnupg Keys: http://arrase.no-ip.org/pubkey.txt>

print "".join(map(lambda numChar:filter(lambda x:(x<"0") or \
(x>"9"),numChar),["0"+chr(104)+"0","1"+chr(111)+"1","2"+chr(108)+"2", \
"3"+chr(97)+"3","4"+chr(32)+"4","5"+chr(109)+"5","6"+chr(117)+"6", \
"7"+chr(110)+"7","8"+chr(100)+"8","9"+chr(111)+"9"]))
Loading...