You are on page 1of 4

¿Cual es el uso del operador % en printf de

variables en lenguaje C?
Formulada hace 2 años y 6 meses Activa hace 2 años y 5 meses Vista 14k veces

Estoy comenzando un curso en youtube de C.

Y muestran que para imprimir los valores de las variables es necesario utilizar este operador % .
16
ejemplo:

int suma, a, b;
a=2;
3 b=3;
suma=a+b;
printf("El valor de la suma es %i", suma);

En caso de entero %i , float %f y char %c

Quisiera saber que otros usos tiene este operador y que atributos tiene dependiendo el valor, pues
vi que podía delimitar los decimales mostrados usando %.1f o %.2f

editada el 5 may. 17 a las 12:49 formulada el 31 mar. 17 a las 19:03


Victor Alvarado
3,461 4 23 58

2 respuestas

En el contexto que defines el % no es un operador sino un especificador de formato.

En C los especificadores de formatos son los que le dicen a las funciones variadicas el tipo de
22 argumento con el que irá a trabajar.

En el caso más simple:

printf("%s\n", "hola mundo");

Le dice al compilador que optimice la llamada a la función printf para un argumento de tipo char
*.

Los especificadores de formato más comunes pueden ser:

- %d o %i: Especifican un entero con signo.


- %u : Especifican un entero sin signo.
- %p : Direccion de un puntero u dato.
- %lld : Especifica un entero largo (long long). [*]
- %llu : Entero largo sin signo (unsigned long long) [*]
- %s : Especifica que el parametro es un puntero a un arreglo de caracteres.
- %c : Un caracter.
- %x : Especifica un valor hexadecimal.
- %% : Muestra un literal de porcentaje.
- %f : Imprime un float o double.

*: Estos especificadores pueden estar fuera de estándar.

Fuera de este contexto, es un operador de módulo y sirve para obtener el residuo de una division.

EDIT:

Adicionalmente, como he mencionado en el principio, es un especificador de formato, tambien


pueden utilizarse para rellenar espacios con ceros o como desees:

printf("%X es lo mismo que %02X", 0x0a, 0x0a);

Esto dara como resultado:

A es lo mismo que 0A

O tambien:

printf("%.03f es un float!\n", 0.250554);

Este ultimo limita a imprimir los 3 primeros lugares despues del punto decimal en un float .

EDIT 2:

Sentí que faltaba algo de información en esta respuesta, la cual está ahora presente en esta
edición y es que los especificadores de formato tienen cierta magia por dentro.

Organicemos esto por tipos:

char * o "C-String": Su especificador es %s , pero que pasa si hacemos: %.2s ?

Supongamos que tenemos el siguiente string: "Hola Mundo" y hacemos:

printf("%.2s\n", "Hola Mundo"); // Resultado: Ho

La respuesta es: Se limita a imprimir solo 3 caracteres del parametro actual; de igual forma se
puede utilizar para espaciar las cadenas:

printf("'%*s'\n", 20, "Hola Mundo"); // Resultado: ' Hola Mundo'

¿Y si los mezclamos?
printf("'%*.2s'\n", 20, "Hola Mundo"); // Resultado: ' Ho'

Como se puede apreciar, todo el formato de una cadena es posible en C.

El caracter * dentro de un especificador de formato, debe incluir un parámetro adicional en la


llamada a la función para especificar su valor, como en los ejemplos mencionados anteriormente.

Aquí debajo una tabla con los posibles tipos de formato que se les puede dar a un parámetro, ver
última referencia (Wikipedia):

Especificador Lo que hace:


----------------------------------------------------------------------------------------
----------
%07i justificado a la derecha, 7 dígitos de largo, sin relleno
%.7i largo mínimo de 7 dígitos, justificado a la derecha, rellena con ceros
%8.2f tamaño total de 8 dígitos, con dos decimales
%.*f”',x,d) tamaño predeterminado,x numeros decimales
%*.*f”,x,y,d) tamaño igual a x, y numeros decimales
%s cadena terminada en null
%5s primeros cinco caracteres o delimitador
%.5s primeros cinco caracteres, sin tener en cuenta el delimitador
%20.5s primeros cinco caracteres, justificados a la derecha, con 20 caracteres
de largo
%-20.5s primeros cinco caracteres, justificados a la izquierda, con 20
caracteres de largo

El formato se aplica prácticamente igual para todos los tipos, pero aun así hay que ser cuidadosos.

Algunas referencias (En inglés):

The GNU C Programming Tutorial


Familia printf (C++Reference)
printf(const char fmt, ...)

Wikipedia, printf

editada el 10 may. 17 a las 16:34 respondida el 31 mar. 17 a las 19:09


NaCl
5,997 2 20 46

entiendo, y es por eso que sino se coloca no muestra la variable – Victor Alvarado el 31 mar. 17 a las 19:10

Exactamente. Cabe mencionar que es comportamiento indefinido si no se especifica el mismo tipo en el


parametro. – NaCl el 31 mar. 17 a las 19:17

1 Cabe vez que editadas te ganas otro positivo, fuera genial que se pudiera votar varias veces jejeje. Gracias
por tu respuesta – Victor Alvarado el 31 mar. 17 a las 19:17

¡Jajaja! Si te ha ayudado, considera marcar la respuesta. – NaCl el 31 mar. 17 a las 19:18

1 También es bueno recordar que no existe un especificador concreto para


diferenciar float de double porque al recibir printf() un número de argumentos variable para los
valores a imprimir, C convierte implícitamente un argumento float a double . Por lo tanto, ya pases
un float o double , printf() lo convierte a double , siendo el especificador %f suficiente para ambos.
Para scanf() en cambio, sí hay diferencia de especificadores entre float y double . – Carlos A. Gómez el
3 jul. 17 a las 12:40
También se usa para el operador Módulo, que no es más que el resto de una división. Por ejemplo,
aquí un pequeño trozo de código en C que dice si un número es par o impar:

2 int numero = 4;

if(numero % 2 == 0)
printf("El número es par");

else
printf("El número no es par");

Este debería sacar por pantalla "El número es par", ya que si divides un número par entre 2, el resto
siempre va a ser 0. Espero que te haya servido de ayuda.

You might also like