SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Igy en Viernes 20 de Noviembre de 2009, 11:28

Título: scanf
Publicado por: Igy en Viernes 20 de Noviembre de 2009, 11:28
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
Título: Re: scanf
Publicado por: Eternal Idol en Viernes 20 de Noviembre de 2009, 11:40
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).
Título: Re: scanf
Publicado por: Igy en Viernes 20 de Noviembre de 2009, 19:38
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
Título: Re: scanf
Publicado por: Eternal Idol en Viernes 20 de Noviembre de 2009, 20:03
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.