Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/08/2014, 20:08
Avatar de vangodp
vangodp
 
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problema con código C

Eso es así por que cuando entras con el numero uno no estas entrando con un entero si no con un char.
Creo que no sabes como funciona la tabla asc2 o si lo sabes te lo voy a refrescar algo la memoria. =)
La función getchar() como su nombre indica sirve para obtener un char y no un int. Si por ejemplo elijo el numero 1 en realidad según la tabla estoy eligiendo ¡tachaaaa!...el 49 XD
Debes usar otra función para obtener enteros como scanf mismo por que getchar te va dar el numero en decimal correspondiente al 1 en la tabla asc2. Eso lo puede mirar en la tabla asc2 que te dejo aqui: http://www.elcodigoascii.com.ar/codi...digo-ascii.gif

Como puedes ver el numero que representa el uno es el 49 y no hay ningún bug en tu programa si no que como dije la funcion getch guarda el numero en decimal que representa las letras de tu teclado. Por ejemplo si pulso la letra a me guarda el numero 97, o si pulso una B mayúscula me guarda el numero que representa la B mayúscula que es el 66 en decimal.
Otra cosa a destacar es que por ejemplo no puedes leer 2 numeros con getchar(). Por ejemplo si tengo: int mivariable = getchar(); y le entro con un numero 27 por ejemplo, lo que va pasar es que solo va leer el 2 y va omitir el 7 por que getchar solo lee un caracter.
Para leer cadenas esta la función gets() que en español es get + la s de string, y eso te le una cadena de caracteres.
Tienes que usar la funcion scanf para leer ese entero que quieres de esta forma: scanf("%d",&mivariable); por que es el modificador %d que se encarga de guardar lo que entras por teclado como un entero al cual le puedes aplicar sumas restas o las demas ecuaciones que se te antoje XD.
Otro consejo que te doy es olvidar el fflush por que tiene comportamiento impredecible con cadenas de caracteres y en cada sistema operativo puede producir diferentes efectos (impredecibles XD).
Si tienes problemas para tomar un numero y quieres ignorar el enter mejor usas scanf("%d%*c",&mivariable);, el scanf tal como lo ves aquí toma un entero con el especificador de formato %d y ignora la primera tecla asc2 que no sea numérica como el enter con el especificador %*c, y así puedes prescindir de usar el fflush.
Espero que te sirva por que es un tema algo lioso pero no dificil de entender. Tu solo recuerda que getchar() y getch() solo leen char y uno solo no 2 chars como puede ser 22 por que se lo toma como un string.
si quieres leer un solo numero te puede servir si le tienes en cuenta que lo que estas leyendo es el código asc2 y no el numero en si. Un ejemplo para leer el numero 1 seria

int caracter;
caracter = getchar();
//si pulsas el 1 mostra el mensaje
if ( caracter == 49 ){
printf("Es el numero 1");
}
//si no pulsaste el 1 se muestra este otro mensaje
else{
printf("No lo es")
}

El problema es que si intentas poner un 11 a lo mejor si te entra o no se por que no lo he probado, supongo que tomara el primer 1 y cuando pulses el enter el segundo 1 se pierde y creo que si entra en "Es el numero 1" y si pasa eso es un bug por que no tiene el comportamiento que queríamos¿No? =D

Bueno te dejo ya pa no liarte mas jeje.

Busca informacion sobre getchar y getch para entender como funcionan ya ademas echa un ojo al funcionamiento de la tabla asc2 en C para entender mejor el problema.
Es muy muy util saber esas cosas ;)