Alinear columnas en la función printf en C

Jinku Hu 12 octubre 2023
  1. Utilice la notación %{integer}d para alinear la salida en C
  2. Utilice la notación %*d para alinear la salida en C
  3. Utilice las notaciones %*d y %{int}d para alinear columnas en la tabla
Alinear columnas en la función printf en C

Este artículo demostrará varios métodos sobre cómo alinear columnas en la función printf en C.

Utilice la notación %{integer}d para alinear la salida en C

printf es parte de la biblioteca de E/S estándar, y se puede utilizar para enviar cadenas formateadas al flujo stdout. La secuencia stdout se almacena en búfer; por lo tanto, puede haber retrasos si la cadena no incluye un carácter de nueva línea. Por lo general, la cadena dada no se imprimirá hasta que no se llene el búfer interno; solo después de ese punto se escribe el contenido en la secuencia stdout.

printf usa especificadores de formato que comienzan con el carácter % para controlar el formato de la cadena. Además de los diferentes especificadores para tipos de datos integrados, algunos símbolos pueden agregar varias características como alineación y relleno. En este caso, insertamos el entero dado entre el % y los caracteres del especificador de formato para denotar el número de espacios a llenar en el lado izquierdo del elemento de salida. En consecuencia, podemos incluir el mismo número para salidas de varias filas para alinear las entradas a la derecha.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int mm1 = 11011;
  int mm2 = 111;
  int mm3 = 11;

  printf("%10d %d\n", mm1, mm1);
  printf("%10d %d\n", mm2, mm2);
  printf("%10d %d\n", mm3, mm3);

  exit(EXIT_SUCCESS);
}

Producción :

11011 11011
  111 111
   11 11

Utilice la notación %*d para alinear la salida en C

Alternativamente, se puede lograr el mismo formato usando la notación %*d, que además requiere que el número entero se proporcione como son los argumentos de datos, después de la coma. Sin embargo, tenga en cuenta que si los especificadores de formato múltiple incluyen el carácter %, todos deben incluir un valor entero separado antes del argumento correspondiente.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int mm1 = 11011;
  int mm2 = 111;
  int mm3 = 11;

  printf("%*d %d\n", 10, mm1, mm1);
  printf("%*d %d\n", 10, mm2, mm2);
  printf("%*d %d\n\n", 10, mm3, mm3);

  exit(EXIT_SUCCESS);
}

Producción :

11011 11011
  111 111
   11 11

Utilice las notaciones %*d y %{int}d para alinear columnas en la tabla

Finalmente, podemos combinar ambos métodos en diferentes escenarios y alinear columnas en cualquier salida de tabla textual. Tenga en cuenta que a veces es necesario que las entradas de las columnas estén alineadas a la izquierda. Podemos lograrlo insertando valores enteros negativos entre los especificadores de formato o pasándolos como argumentos con la notación %*d. La última solución es más adecuada cuando el relleno no se conoce como constante y se puede calcular dinámicamente durante el tiempo de ejecución.

#include <stdio.h>
#include <stdlib.h>

#ifndef MAX
#define MAX 10
#endif

int main(int argc, char const *argv[]) {
  char *row1[] = {"num", "name", "sum"};
  int col1[] = {1, 2, 3};
  char *col2[] = {"one", "two", "three"};
  int col3[] = {1243, 14234, 3324};

  printf("%*s | %*s | %*s\n", -3, row1[0], -MAX, row1[1], MAX, row1[2]);
  printf("%*c | %*c | %*c\n", -3, '-', -MAX, '-', MAX, '-');
  size_t len = sizeof col1 / sizeof col1[0];
  for (int i = 0; i < len; ++i) {
    printf("%-3d | %-10s | %10d\n", col1[i], col2[i], col3[i]);
  }

  exit(EXIT_SUCCESS);
}

Producción :

num | name       |        sum
-   | -          |          -
1   | one        |       1243
2   | two        |      14234
3   | three      |       3324
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C IO