La estructura para una sentencia scanf es la siguiente:
int scanf(const char *formato, ...);
Hasta donde yo entiendo, scanf nos sirve para la entrada de datos, sean estos, enteros, cadenas, caracteres, etc, regresando un valor que nos indica el número de datos ingresados con éxito, siempre y cuando su sentencia este bien declarada. Por ejemplo:
#include <stdio.h>
int main( int argc, char *argv[] ){
int nip = 0; // La asignación puede omitirse
printf("Teclee el nuevo nip de su tarjeta de débito: " );
scanf("%d", &nip );
printf( "\nSu nip: %d ha sido modificado con éxito! ", nip );
return 0;
}
Pero… ¿Qué pasaría si en la linea 7 yo tecleara una letra ‘G’?
Una de las dudas frecuentes dudas entre los estudiantes que inician en este lenguje es como validar estos errores de entrada. La primera y más típica solución que se dio en una encuesta realizada a una población de 2 estudiantes arrojó que el 100% intento resolver esto por medio del uso del tan famoso código ASCCI.
Si alguien me pudiera indicar si lo logró, en no más de 7 lineas, que me diga para felicitarlo. Si alguien no sabe que es el código ASCCI, que no me diga, y que mejor se retire a leer un buen rato. Pero bueno, una solución a la que llegamos, fue el propio y maraviloso scanf. ¿Cuál es esta? Usar el valor retornado por la función. Si en el ejemplo anterior, usaramos 3 lineas más…
#include <stdio.h>
int main( int argc, char *argv[] ){
int nip, error = 0 ; // La asignación puede ayudar...
do{
printf("Teclee el nuevo nip de su tarjeta de débito: " );
fflush( stdin );
error = scanf("%d", &nip );
}while( valida_entrada( error ) );
printf( "\nSu nip: %d ha sido modificado con éxito! ", nip );
return 0;
}
… y añadiéramos la siguiente función:
int valida_entrada( int err ){
if( err == 0 ){
printf("\n\n\t ERROR! VALOR INCORRECTO. \n\n ");
return 1;
}
return 0;
}
El problema de validacíon estaría sencillamente resuelto. ¿Qué aportaron estas líneas a nuestra causa?
1. La sentencia do-while, ayuda a prevenir el error las veces que el usuario introduzca un valor incorrecto. Ejemplo: El usuario introduce “patos” la primera vez, “patos” la segunda y “patos” la tercera hasta que al final se digna a teclear 1234
2. La fución fflush( stdin ), ayuda a limpiar el flujo de entrada estandar (stdin) para que el ciclo do-while no se cicle jamás.
Ahora, esto sirve solo para la entrada de 1 solo dato. Si quisiéramos validar la entrada de más datos, solo tendríamos que tomar en cuenta la sentencia booleana del IF en la función “valida_entrada”, considerando el número de datos quese deseen validar. Ejemplo:
int valida_entrada( int err ){
if( err == 0 || error == 1 ){
printf("\n\n\t ERROR! VALOR(ES) INCORRECTO(S). \n\n ");
return 1;
}
return 0;
}
Si err = 0, no se leyó ningún dato, si err = 1, se leyó sólo un dato, si el err = 2, se leyeron dos datos correctos, no hay error, asi que regresamos un cero.
Para los masters, podemos enviar directamente el valor de retorno de scanf…
do{
printf("Teclee el nuevo nip de su tarjeta de débito: " );
fflush( stdin );
}while( valida_entrada( scanf("%d", &nip ) ) );
Y así nos ahorramos una linea jejeje. Ok, espero haya sido de ayuda.