3.4) La función scanf.
Mediante la función scanf podemos introducir cualquier combinación de valores numéricos, caracteres sueltos y cadenas de caracteres a través del teclado. En definitiva, scanf lee datos formateados de la entrada estandar. Cuando hablamos de datos formateados, nos referimos a que los datos se pueden presentar en distintos formatos. La función devolverá el número de datos que se han introducido correctamente.

En general, una refencia a la función scanf se escribe:
 

 
scanf (cadena de control, lista de argumentos);


en donde cadena de control hace referencia a una cadena de caracteres que contiene información sobre el formato de los datos (debe haber tantos códigos de formato como argumentos), y la lista de argumentos son argumentos que representan los datos.

En la cadena de control se incluyen grupos individuales de caracteres cada uno de los cuales deben comenzar por %. Normalmente, un grupo de caracteres estará formado por el signo de porcentaje seguido de un carácter de conversión que indica el tipo del dato correspondiente.

Dentro de la cadena de control se pueden encontrar varios caracteres seguidos o separados por espacios en blanco, tabuladores o caracteres de nueva linea (es muy frecuente el uso de caracteres en blanco para separar grupos de caracteres). El uso de caracteres de espaciado hace que scanf lea, pero no guarde, cualquier número de espacios en blanco hasta el primer carácter no blanco.

Veamos en una tabla los carácteres de conversión más frecuentes:

(recordar que delante de estos carácteres va siempre %)
 
 

 
Carácter 
Significado
c Lee un carácter simple
d Lee un entero decimal 
i Lee un entero decimal, octal o hexadecimal
e Lee un número en punto flotante
f Lee un número en punto flotante
g Usa %e o %f, el más corto en long.
o Lee un entero octal corto
s Lee una cadena de caracteres
u Lee un entero decimal sin signo
x Lee un entero hexadecimal 
[...] Lee una cadena de caracteres con caracteres de espaciado
p Lee un puntero
NOTA: scanf tiene el carácter especial * que situado entre el % y el código, lee los datos del tipo especificado, pero elimina su asignación.

Los argumentos de scanf han de ser punteros que no son otra cosa que direcciones de memoria donde se encuentran los datos. Para obtener la direción de memoria de una variable, es necesario aplicarle el operador monario & de la forma:
 

 
& variable


NOTA: Los nombres de arrays no deben ser precedidos por &.

Veamos una aplicación típica de la función scanf:



 
 

Por ahora es suficiente para aprender a utilizar la función scanf. Más adelante le dedicaremos una lección completa al tema de punteros.

Por último, añadir que los tipos de los argumentos deben coincidir con los indicados por los grupos de caracteres correspondientes en la cadena de control.

Veamos ahora un ejemplo de cómo se puede usar la función scanf para leer una palabra. Como se verá, no será necesario recurrir al uso de un bucle para recorrer cada uno de los elementos del vector (como con la función getchar), ya que scanf  lo hace con una única instrucción. Además, al utilizarse el parámetro "%s", sólo podremos leer una palabra.

NOTA: El vector ciudad aparece en la instrucción scanf sin el símbolo & al tratarse ya de una dirección de memoria (es un vector).
 



 
 


CARACTERISTICAS AVANZADAS DE SCANF:

En esta sección veremos algunos detalles adicionales se la función scanf.

Veremos en primer lugar cómo podemos limitar el número de los carácteres especificando una longitud de campo máxima para ese dato. Para ello, se introduce en la cadena de control un entero sin signo que indica la longitud del campo, entre el signo % y el carácter de conversión.

Veamos cómo funciona: (Suponed que los botones a pulsar representan las posibles asignaciones de las vbles. a, b, c)
 


 

Veamos cómo podemos leer distintos tipos de datos con scanf:


 
Veamos cómo funciona el carácter de supresión junto a la función scanf: