Especificadores de formato en C

Muhammad Husnain 12 octubre 2023
Especificadores de formato en C

Este artículo trata sobre el uso de la función printf en lenguaje C y el especificador de formato utilizado en esta función. El artículo discutirá, en detalle, la sintaxis de los especificadores de formato y cómo se utilizan para diferentes tipos de datos.

Veamos primero la sintaxis de la función printf.

Especificadores de formato en la función printf() en C

La sintaxis de la función printf() es:

int printf(const char* format, ...);

Esta función escribe la cadena almacenada en la variable format en la consola de salida estándar. Si esta cadena incluye especificadores de formato, es decir, algunas subcadenas que comienzan con el símbolo % para especificar algunas variables, estos se reemplazan con los valores especificados después de la cadena.

Parámetros:

  • format

El texto que se escribirá en la salida se almacena en esta cadena C. Opcionalmente, puede incluir especificadores de formato incrustados, reemplazados por los valores proporcionados en los siguientes argumentos adicionales y formateados según sea necesario.

Un especificador de formato sigue el siguiente patrón:

%[flags][width][.precision][length]specifier

Los corchetes [] indican que estos especificadores son opcionales. Por ejemplo, printf("%lu",4294967295) significa imprimir 4294967295 en formato largo sin firmar.

Aquí, l es un especificador de longitud para long int, y u es un especificador para números sin signo. El resto de los argumentos opcionales se ignoran.

El especificador al final de este patrón es la parte más significativa ya que define el tipo de datos a imprimir. La lista de diferentes especificadores y sus descripciones se muestra en la siguiente tabla:

especificador Descripción
d o i entero decimal con signo
u entero decimal sin signo
o número octal sin signo
x número hexadecimal sin signo
X hexadecimal sin signo en mayúsculas
f punto flotante decimal en minúsculas
F punto flotante decimal en mayúsculas
c personaje
s cadena
a punto flotante hexadecimal en minúsculas
A punto flotante hexadecimal en mayúsculas
p dirección del puntero

Los subespecificadores restantes antes del especificador son todos opcionales, pero su propósito se define a continuación.

Banderas:

banderas Descripción
- para justificar a la izquierda el campo.
+ Coloque a la fuerza un signo más antes de los números positivos
# se utiliza para especificadores octales y hexadecimales (o,x,X) para colocar 0, 0x o 0X respectivamente.
0 suma 0 a la izquierda del valor.

Ancho:

ancho Descripción
(number) especifica el número mínimo de caracteres que se imprimirán.
* El ancho se proporciona como un argumento de valor entero adicional que precede al argumento que se va a formatear en lugar de en la cadena de formato.

Precisión:

Precisión Descripción
.number Especifica el número mínimo de dígitos que se imprimirán. Si el número tiene menos dígitos, estos se rellenan con ceros a la izquierda.
.* La precisión se proporciona como un argumento de valor entero adicional que precede al argumento que se va a formatear en lugar de en la cadena de formato.

Longitud:

Longitud Descripción
hh Especifica printf para asumir un argumento entero de tamaño entero promovido desde un char para tipos enteros.
h Especifica printf para asumir un argumento entero de tamaño entero promovido desde un corto para tipos enteros.
l Especifica printf para asumir un argumento entero de tamaño largo para tipos enteros. Esto se ignora para los tipos de coma flotante. Al usar varargs, los argumentos flotantes se promocionan automáticamente a doble.
ll Especifica printf para asumir un argumento entero largo de gran tamaño para tipos enteros.
L Especifica printf para asumir un argumento doble largo para tipos de punto flotante.
z Para tipos enteros, especifica printf para asumir un argumento entero de tamaño size_t.
j Para tipos enteros, especifica printf para asumir un argumento entero de tamaño intmax_t.
t Para tipos enteros, especifica printf para asumir un argumento entero de tamaño ptrdiff_t.
  • ...

La función puede esperar una secuencia de argumentos adicionales, cada uno con un valor para reemplazar un especificador de formato en la cadena de formato, según la cadena de formato (o un puntero a una ubicación de almacenamiento, para n).

El número de estos parámetros debe ser, al menos, igual al número de valores indicados en los especificadores de formato. La función ignora cualquier argumento adicional.

Valor devuelto:

La cantidad total de caracteres escritos se devuelve si la operación es exitosa. Se establece la indicación de error (ferror), y se devuelve un entero negativo si se produce un error de escritura.

Errno se establece en EILSEQ, y se proporciona un número entero negativo si se produce un error de codificación de caracteres multibyte al escribir caracteres anchos.

Ejemplo:

#include <stdio.h>

int main() {
  printf("Some Character values: %c %c \n", 'b', 66);
  printf("Some Decimal Value: %d %ld\n", 1234, 670000L);
  printf("Numbers preceeding with blank spaces: %10d \n", 1234);
  printf("Numbers preceeding with zeros: %010d \n", 1235);
  printf("Different number systems: %d %x %o %#x %#o \n", 100, 100, 100, 100,
         100);
  return 0;
}

Producción :

Some Character values: b B
Some Decimal Value: 1234 670000
Numbers preceeding with blank spaces:       1234
Numbers preceeding with zeros: 0000001235
Different number systems: 100 64 144 0x64 0144
Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn