SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: krnl64 en Jueves 14 de Mayo de 2009, 21:30

Título: fallo intentando hacer scanf personalizado
Publicado por: krnl64 en Jueves 14 de Mayo de 2009, 21:30
Hola a todos.

Estoy intentando hacer un wrapper para scanf. Mi intencion es limpiar el buffer de consola antes y despues ejecutar la funcion scanf original.

El code es este:
Código: C
  1.  
  2.  
  3. void myscanf(const char *format,...)
  4. {
  5.  
  6.     va_list args;
  7.         char c;
  8.                          
  9.             while((c = getchar()) != EOF); 
  10.         va_start(args,format);
  11.         scanf(format,args);
  12.         va_end(args);
  13. }
  14.  
  15.  


El caso es que a scanf no le llegan los argumentos .... y no se por qué.

Puede alguien decirme que he hecho mal ?

PD: tengo todos los includes.
Gracias
Título: Re: fallo intentando hacer scanf personalizado
Publicado por: Eternal Idol en Jueves 14 de Mayo de 2009, 21:39
Yo lo depure y jamas sale del while ...
Título: Re: fallo intentando hacer scanf personalizado
Publicado por: krnl64 en Jueves 14 de Mayo de 2009, 21:50
Ahora arreglo eso.

Supon que limpia el buffer.
Título: Re: fallo intentando hacer scanf personalizado
Publicado por: Eternal Idol en Jueves 14 de Mayo de 2009, 22:24
Me parece que no podes pasar el va_list, tenes que usar va_arg ... igual ¿No es mucho mejor usar fgets y sscanf (en lugar de limpiar el buffer no ensuciarlo directamente)?
Título: Re: fallo intentando hacer scanf personalizado
Publicado por: krnl64 en Viernes 15 de Mayo de 2009, 22:05
Claro, me gustaria no ensuciarlo. Pero entonces cómo hago que este trozo de codigo funcione ?

Código: C
  1.  
  2.     printf("nintroduzca una cadena");
  3.     scanf("%49[a-z]",b);
  4.     printf("nintroduzca otra cadena: ");
  5.     scanf("%49[a-z]",c);
  6.  
  7.  

Ese code solo te deja introducir una cadena. El 2º scanf se lo salta.

Cual es la solucion correcta ?

Gracias
Título: Re: fallo intentando hacer scanf personalizado
Publicado por: Eternal Idol en Viernes 15 de Mayo de 2009, 22:27
Código: C++
  1. printf("nintroduzca una cadena");
  2. char line[80];
  3. fgets(line, sizeof(line), stdin);
  4. sscanf(line, "%49[a-z]",b);
  5. printf("nintroduzca otra cadena: ");
  6. *line = 0;
  7. fgets(line, sizeof(line), stdin);
  8. sscanf(line, "%49[a-z]",c);
  9.  

PD. Es una palabra mas que una cadena.
Título: Re: fallo intentando hacer scanf personalizado
Publicado por: krnl64 en Viernes 15 de Mayo de 2009, 23:55
O sea, la técnica es leer el buffer de entrada en un array y obtener de ese array los datos que buscamos.
No entiendo la linea 6.
Haciendo
Código: C
  1.  
  2. *line=0;
  3.  
  4.  
No borras solo el primer caracter del buffer y el resto se queda en la memoria ?

No deberia ser
Código: C
  1.  
  2. memset(line,0,80);
  3.  
  4.  
para borrar el contenido del array y en caso que quisiera liberarlo poner *line=0?
Título: Re: fallo intentando hacer scanf personalizado
Publicado por: Eternal Idol en Sábado 16 de Mayo de 2009, 00:06
La tecnica es leer con una funcion como fgets que a diferencia de scanf no deja basura en el buffer, la cadena donde se almacene puede ser memoria dinamica tranquilamente no tiene que ser un array.

Con  *line = 0; hacemos que la cadena linea este vacia (las cadenas terminan en 0), supongamos que fgets falla y no escribe nada (lo mismo habria que hacer al principio, igual es un ejemplo nada mas), entonces seguimos teniendo una cadena vacia, el metodo del memset tambien es bueno (siempre es mejor usar sizeof por si cambiamos el tamaño).
Título: Re: fallo intentando hacer scanf personalizado
Publicado por: krnl64 en Sábado 16 de Mayo de 2009, 00:13
Muchas Gracias, me sacaste de la duda.
Saludos.
Título: Re: fallo intentando hacer scanf personalizado
Publicado por: Eternal Idol en Sábado 16 de Mayo de 2009, 01:17
De nadas  B)