• Lunes 29 de Abril de 2024, 01:33

Autor Tema:  fallo intentando hacer scanf personalizado  (Leído 1949 veces)

krnl64

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
fallo intentando hacer scanf personalizado
« en: Jueves 14 de Mayo de 2009, 21:30 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: fallo intentando hacer scanf personalizado
« Respuesta #1 en: Jueves 14 de Mayo de 2009, 21:39 »
0
Yo lo depure y jamas sale del while ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

krnl64

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
Re: fallo intentando hacer scanf personalizado
« Respuesta #2 en: Jueves 14 de Mayo de 2009, 21:50 »
0
Ahora arreglo eso.

Supon que limpia el buffer.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: fallo intentando hacer scanf personalizado
« Respuesta #3 en: Jueves 14 de Mayo de 2009, 22:24 »
0
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)?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

krnl64

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
Re: fallo intentando hacer scanf personalizado
« Respuesta #4 en: Viernes 15 de Mayo de 2009, 22:05 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: fallo intentando hacer scanf personalizado
« Respuesta #5 en: Viernes 15 de Mayo de 2009, 22:27 »
0
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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

krnl64

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
Re: fallo intentando hacer scanf personalizado
« Respuesta #6 en: Viernes 15 de Mayo de 2009, 23:55 »
0
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?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: fallo intentando hacer scanf personalizado
« Respuesta #7 en: Sábado 16 de Mayo de 2009, 00:06 »
0
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).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

krnl64

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
Re: fallo intentando hacer scanf personalizado
« Respuesta #8 en: Sábado 16 de Mayo de 2009, 00:13 »
0
Muchas Gracias, me sacaste de la duda.
Saludos.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: fallo intentando hacer scanf personalizado
« Respuesta #9 en: Sábado 16 de Mayo de 2009, 01:17 »
0
De nadas  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.