|
|
| Contenidos > 1.9.2.1
Especificadores de formato |
|
Especificadores
de formato
En la fución scanf,
por cada argumento (variable) que se le pase, se debe escribir un
especificador de formato, que establecerá el formato de
entrada
por teclado del argumento. La forma más sencilla de escribir
un
especificador de formato en la función scanf
es con el carácter tanto
por ciento (%)
seguido de un carácter
de conversión
que indique el tipo de dato del argumento. De momento, no es necesario
conocer todos los especificadores de formato que se pueden usar en la
función scanf,
pero sí, los más usados, que son los mismos que
en la función printf:
Figura. Especificadores
de formato más utilizados en la función scanf.
Ejemplo
1: (ejemplo_11_40.c
del libro)
Dado el programa
#include
<stdio.h>
int
main()
{
int
numero;
printf( "\n
Introduzca un numero entero: " );
scanf( "%d",
&numero );
return 0;
} |
En la memoria
se reservará espacio para la variable numero.
Y si el usuario
teclea, por ejemplo, un 5,
en pantalla se verá
Introduzca un numero entero: 5
|
Puesto que la variable numero
es de tipo entero, en la cadena de control se tiene que escribir el
especificador de formato asociado a la entrada de un número
entero (%d).
Por otro lado, la variable numero
se ha escrito precedida del carácter ampersand (&).
Se trata de un nuevo operador, el operador
dirección. El operador dirección
(&)
siempre actúa sobre un operando (normalmente una variable)
y, de
su evaluación, se obtiene la dirección de memoria
de
dicha variable.
Es sabido que, una variable representa a un espacio de memoria en el
cual se puede almacenar un dato. Pues bien, en realidad, a la
función scanf
no se le pasa una lista de variables, sino, las direcciones de memoria
de los espacios de memoria a los que representan dichas variables.
Para todas las variables declaradas en un programa se reservan espacios
de memoria en donde se almacenarán datos. La memoria del computador
está dividida en celdas numeradas de forma
consecutiva, por lo que, cada una de ellas tiene una
dirección
(un número). Un dato puede necesitar una o más
celdas de
memoria. Así pues, en el ejemplo_11_40,
la
expresión &numero
hace referencia a la primera celda donde se va a almacenar el valor 5
introducido por el usuario. La dirección de memoria de la
variable numero
podría ser, por ejemplo, 0012FF88.
En informática,
las direcciones de memoria suelen
representarse
con números hexadecimales. Gráficamente, se puede
representar de la siguiente manera:
El operador dirección (&)
entra dentro de la categoría de operadores monarios y,
siguiendo
con el ejemplo, de la evaluación de la expresión
&numero
se obtiene el valor 0012FF88,
que es la dirección de memoria de la variable numero.
Esa dirección la necesita conocer la
función scanf
para localizar la primera celda del espacio de memoria en donde se va a
almacenar el 5
introducido por el usuario.
La dirección de memoria de la variable numero
se puede visualizar en pantalla escribiendo
printf ( "%p", &numero
);
Puesto que, de la expresión &numero
se obtiene una dirección de memoria, en la cadena de control
de la función printf
se tiene que escribir el especificador de formato asociado a la salida
de una dirección de memoria, (%p).
Obsérvese que, en la cadena de control de printf,
se ha eludido escribir con tilde la palabra numero,
ya que, de haberlo hecho, por pantalla hubiesemos visto algo parecido a:
Introduzca un n·mero entero: 5
|
Para visualizar el carácter 'ú',
podemos escribir:
printf(
"\n Introduzca un n%cmero entero: ", 163
);
Fíjese que, 163
es el número decimal que corresponde al carácter 'ú'
en ASCII.
Ejemplo 2: (ejemplo_11_41.c
del libro) Ahora,
estudiemos el siguiente programa:
#include
<math.h>
#include
<stdio.h>
#define
PI 3.141592
int
main()
{
float
area, radio;
printf( "\n
Introduzca radio: " );
scanf( "%f",
&radio );
area = PI * pow( radio, 2
);
printf( "\n
El area de la circunferencia es: %f", area );
return 0;
} |
Inicialmente, en la memoria se reservará espacio para las
dos variables del programa.
Si el usuario
teclea, por ejemplo, el valor 3.8
para el radio, en pantalla se visualizará:
Introduzca radio: 3.8
El area de la circunferencia es: 45.364588
|
La variable radio
es de tipo real y, por tanto, en la cadena de control de la
función scanf
se tiene que escribir el especificador de formato asociado a la entrada
de un número real, (%f).
Y, puesto que, en la función printf,
el resultado de evaluar la expresión area
también es de tipo real, en su cadena de control hay que
escribir, de igual forma, el especificador de formato asociado a la
salida de un número real, (%f).
Para que el área se muestre sólo con dos cifras
decimales, es decir, 45.36
en vez de 45.364588,
en la cadena de control de la función printf
se debe escribir %.2f
en vez de %f.
printf(
"\n El area
de la circunferencia es: %.2f",
area
);
En pantalla se verá
Introduzca radio: 3.8
El area de la circunferencia es: 45.36
|
Aunque sólo se muestren dos cifras decimales, en memoria el area
seguirá valiendo 45.364588.
Por otra parte, hemos dicho que, para conocer la dirección
de
memoria de una variable, se puede utilizar el operador
dirección
(&).
Pero, esta regla no es general. Por ejemplo, no es aplicable a las
variables (arrays) de tipo cadena.
Ejemplo 3: (ejemplo_11_42.c
del libro)
Si se desea desarrollar un programa para leer un nombre de persona
se puede
escribir
#include
<stdio.h>
int
main()
{
char
nombre[5];
printf( "\n
Introduzca nombre: " );
scanf( "%s",
nombre );
return 0;
} |
Obsérvese que, a la función scanf
se le "pasa" nombre
en vez de &nombre.
Esto es así, ya que, para las variables de tipo cadena
(arrays de caracteres), su propio identificador (nombre,
en este caso) ya hace referencia a la dirección de memoria
donde
se va a almacenar el dato. Más concretamente, hace
referencia al
espacio reservado en memoria para guardar el primer carácter
de
la cadena. Para el resto de caracteres de la cadena, el sistema
habrá reservado, en memoria, espacios contiguos al primero.
Nótese que, la variable nombre
ha sido declarada con un tamaño de cinco caracteres. Por
consiguiente, con este programa sólo se podrá
almacenar
en memoria un nombre de persona de hasta cuatro caracteres, ya que, en
el quinto debe guardarse el carácter nulo (\0).
Ejercicios
Recomendados:
|
|
|
|
|