• Jueves 14 de Noviembre de 2024, 17:20

Autor Tema:  scanf  (Leído 970 veces)

Igy

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
scanf
« en: Viernes 20 de Noviembre de 2009, 11:28 »
0
buenas.
busco la manera de leer por teclado un numero con lo que he dicidido usar un scanf que recoja un entero, pero logicamente, cuando el programa recibe algo que no sea un numero, se vuelve loco. a partir de aqui se me ocurren dos soluciones:
1. seguir con un a=scanf("d", option),  y controlar lo que recibe con un if(a!=o), el tema esta en el scanf cuando no lee un entero no se lo traga por lo que cuando vuelva a pasar por ahi mi scanf mantendra lo que le haya pasado, sin dejar avanzar al programa. la solucion a eso imagino que es ponerle delante algo que limpie lo que hay en el scanf, como un fflush, pero si existe tal funcion no la conozco.

2. poner un scanf que reciba un string y luego mirar si lo que hay en mi string es un entero o no, pero no se hacer esa comparacion.

¿Que veis mas factible o mas facil?
Gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: scanf
« Respuesta #1 en: Viernes 20 de Noviembre de 2009, 11:40 »
0
scanf es mejor no usarlo nunca, lo podes reemplazar por:


Código: C++
  1. char line[80];
  2. fgets(line, sizeof(line), stdin);
  3. int option = 0;
  4. int itemsRead = sscanf(line, "%d", &option);
  5.  

De esta manera podes pasar a fgets el tamaño de la cadena y nunca tendras problemas con buffers no leidos (si ninguna funcion lo ensucia como hace scanf te podes olvidar de hacks para limpiarlo como fflush con stdin).

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.

Igy

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: scanf
« Respuesta #2 en: Viernes 20 de Noviembre de 2009, 19:38 »
0
humm ya veo, ese array es susceptible de ser cambiado por un puntero a char para no especificar el tamaño a priori? se que nadie es tan cabron de poner mas de 80 caracteres cuando se pida un numero pero tengo que cubrir todos los casos posibles

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: scanf
« Respuesta #3 en: Viernes 20 de Noviembre de 2009, 20:03 »
0
Si, pero no es necesario debido a que ya esta cubierto ese caso, justamente al poder pasarle el tamaño del buffer a fgets evitamos buffer overflows, podes comprobarlo poniendo tamaños mas chicos para el array.

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.