![]() | ![]() |
Algo muy usual en un programa es esperar que el usuario introduzca datos por el teclado. Para ello contamos con varias posibilidades: Usar las funciones de la biblioteca estбndar, crear nuestras propias interrupciones de teclado (MS-Dos) o usar funciones de alguna biblioteca diferente (como por ejemplo Allegro).
Nosotros en este capнtulo vamos a estudiar la primera, usando las funciones de la biblioteca estбndar. Pero veamos por encima las otras posibilidades.
Las funciones estбndar estбn bien para un programa sencillito. Pero cuando queremos hacer juegos por ejemplo, no suelen ser suficiente. Demasiado lentas o no nos dan todas las posibilidades que buscamos, como comprobar si hay varias teclas pulsadas. Para solucionar esto tenemos dos posibilidades:
La mбs coplicada es crear nuestras propias interrupciones de teclado. їQuй es una interrupciуn de teclado? Es un pequeсo programa en memoria que se ejecuta contнnuamente y comprueba el estado del teclado. Podemos crear uno nuestro y hacer que el ordenador use el que hemos creado en vez del suyo. Este tema no lo vamos a tratar ahora, quizбs en algъn capнtulo posteror.
Otra posibilidad mбs sencilla es usar una biblioteca que tenga funciones para controlar el teclado. Por ejemplo si usamos la biblioteca Allegro, ella misma hace todo el trabajo y nosotros no tenemos mбs que recoger sus frutos con un par de sencillas instrucciones. Esto soluciona mucho el trabajo y nos libra de tener que aprender cуmo funcionan los aspectos mбs oscuros del control del teclado.
Vamos ahora con las funciones de la biblioteca estбndar.
El uso de scanf es muy similar al de printf con una diferencia, nos da la posibilidad de que el usuario introduzca datos en vez de mostrarlos. No nos permite mostrar texto en la pantalla, por eso si queremos mostrar un mensaje usamos un printf delante. Un ejemplo:
#include <stdio.h> int main() { int num; printf( "Introduce un nъmero " ); scanf( "%i", &num ); printf( "Has tecleado el nъmero %i\n", num ); return 0; }
Primero vamos a ver unas nota de estйtica, para hacer los programas un poco mбs elegantes. Parece una tonterнa, pero los pequeсos detalles hacen que un programa gane mucho. El scanf no mueve el cursor de su posiciуn actual, asн que en nuestro ejemplo queda:
Introduce un nъmero /* La barra horizontal indica dуnde esta el cursor */
Esto es porque en el printf no hemos puesto al final el sнmbolo de salto de lнnea '\n'. Ademбs hemos dejado un espacio al final de Introduce un nъmero: para que asн cuando tecleemos el nъmero no salga pegado al mensaje. Si no hubiйsemos dejado el espacio quedarнa asн al introducir el nъmero 120 (es un ejemplo):
Introduce un nъmero120
Bueno, esto es muy interesante pero vamos a dejarlo y vamos al grano. Veamos cуmo funciona el scanf. Lo primero nos fijamos que hay una cadena entre comillas. Esta es similar a la de printf, nos sirve para indicarle al compilador quй tipo de datos estamos pidiendo. Como en este caso es un integer usamos %i. Despuйs de la coma tenemos la variable donde almacenamos el dato, en este caso 'num'.
Fнjate que en el scanf la variable 'num' lleva delante el sнmbolo &, este es muy importante, sirve para indicar al compilador cual es la direcciуn (o posiciуn en la memoria) de la variable. Por ahora no te preocupes por eso, ya volveremos mбs adelante sobre el tema.
Podemos preguntar por mбs de una variable a la vez en un sуlo scanf, hay que poner un %i por cada variable:
#include <stdio.h> int main() { int a, b, c; printf( "Introduce tres nъmeros: " ); scanf( "%i %i %i", &a, &b, &c ); printf( "Has tecleado los nъmeros %i %i %i\n", a, b, c ); return 0; }
De esta forma cuando el usuario ejecuta el programa debe introducir los tres datos separados por un espacio.
Tambiйn podemos pedir en un mismo scanf variables de distinto tipo:
#include <stdio.h> int main() { int a; float b; printf( "Introduce dos nъmeros: " ); scanf( "%i %f", &a, &b ); printf( "Has tecleado los nъmeros %i %f\n", a, b ); return 0; }
A cada modificador (%i, %f) le debe corresponder una variable de su mismo tipo. Es decir, al poner un %i el compilador espera que su variable correspondiente sea de tipo int. Si ponemos %f espera una variable tipo float.
Si lo que queremos es que el usuario introduzca un caracter por el teclado usamos las funciones getch y getche. Estas esperan a que el usuario introduzca un carбcter por el teclado. La diferencia entre getche y getch es que la primera saca por pantalla la tecla que hemos pulsado y la segunda no (la e del final se refiere a echo=eco). Ejemplos:
#include <stdio.h> int main() { char letra; printf( "Introduce una letra: " ); fflush( stdout ); letra = getche(); printf( "\nHas introducido la letra: %c", letra ); return 0; }
Introduce una letra: a Has introducido la letra: a
Quizбs te estйs preguntando quй es eso de fflush( stdout ). Pues bien, cuando usamos la funciуn printf, no escribimos directamente en la pantalla, sino en una memoria intermedia (lo que llaman un bufer). Cuando este bufer se llena o cuando metemos un carбcter '\n' es cuando se envia el texto a la pantalla. En este ejemplo yo querнa que apareciera el mensaje Introduce una letra: y el cursor se quedara justo despuйs, es decir, sin usar '\n'. Si se hace esto, en algunos compiladores el mensaje no se muestra en pantalla hasta que se pulsa una tecla (pruйbalo en el tuyo). Y la funciуn fflush( stdout ) lo que hace es enviar a la pantalla lo que hay en ese bufer.
Y ahora un ejemplo con getch:
#include <stdio.h> int main() { char letra; printf( "Introduce una letra: " ); fflush( stdout ); letra = getch(); printf("\n has introducido la letra :%c", letra ); return 0; }
Resultado:
Introduce una letra: Has introducido la letra: a
Como vemos la ъnica diferencia es que en el primer ejemplo se muestra en pantalla lo que escribimos y en el segundo no.
Ejercicio 1: Busca el error en el siguiente programa:
#include <stdio.h>
int main() {
int numero;
printf( "Introduce un numero: " );
scanf( "%d", numero );
printf( "\nHas introducido el numero %d.\n", numero );
return 0;
}
Solucion:
A la variable numero le falta el '&' con lo que no estamos indicando al programa la direccion de la variable y no obtendremos el resultado deseado. Haz la prueba y veras que el mensaje "Has introducido el numero X" no muestra el numero que habias introducido.
© Gorka Urrutia