|
|
|
|
|
|
CarlosPes.com
> Curso
de Lenguaje C
> Especificadores de Formato en la Función
scanf del Lenguaje C |
|
Especificadores de Formato en
la Función scanf del Lenguaje C
|
|
|
|
|
¿Cómo
utilizar un especificador de formato en la función scanf de
C?
|
|
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: 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 1, 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: 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: 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). |
|
|
|
|
|
|
|
|