Allinea colonne nella funzione printf in C

Jinku Hu 12 ottobre 2023
  1. Usa la notazione %{integer}d per allineare l’output in C
  2. Usa la notazione %*d per allineare l’output in C
  3. Usa le notazioni %*d e %{int}d per allineare le colonne nella tabella
Allinea colonne nella funzione printf in C

Questo articolo mostrerà diversi metodi su come allineare le colonne nella funzione printf in C.

Usa la notazione %{integer}d per allineare l’output in C

printf fa parte della libreria I/O standard e può essere utilizzato per inviare in output una stringa formattata al flusso stdout. Il flusso stdout è bufferizzato; pertanto, potrebbero verificarsi ritardi se la stringa non include un carattere di nuova riga. Di solito, la stringa data non verrà stampata fino a quando il buffer interno non viene riempito; solo dopo quel punto il contenuto viene scritto nel flusso stdout.

printf usa gli specificatori di formato che iniziano con il carattere % per controllare la formattazione della stringa. Oltre ai diversi specificatori per i tipi di dati incorporati, alcuni simboli possono aggiungere varie funzionalità come l’allineamento e il riempimento. In questo caso, inseriamo il numero intero specificato tra i caratteri % e l’identificatore di formato per indicare il numero di spazi da riempire sul lato sinistro dell’elemento di output. Di conseguenza, possiamo includere lo stesso numero per più output di righe per allineare le voci a destra.

#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);
}

Produzione:

11011 11011
  111 111
   11 11

Usa la notazione %*d per allineare l’output in C

In alternativa, la stessa formattazione può essere ottenuta usando la notazione %*d, che richiede inoltre che venga fornito il numero intero come sono gli argomenti dei dati - dopo la virgola. Tuttavia, se gli specificatori di formato multipli includono il carattere %, devono includere tutti un valore intero separato prima dell’argomento corrispondente.

#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);
}

Produzione:

11011 11011
  111 111
   11 11

Usa le notazioni %*d e %{int}d per allineare le colonne nella tabella

Infine, possiamo combinare entrambi i metodi in diversi scenari e allineare le colonne in qualsiasi output di tabella testuale. Si noti che a volte è necessario che le voci di colonna siano allineate a sinistra. Possiamo ottenerlo inserendo valori interi negativi tra gli specificatori di formato o passandoli come argomenti con la notazione %*d. Quest’ultima soluzione è più adatta quando il riempimento non è noto come costante e può essere calcolato dinamicamente durante il runtime.

#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);
}

Produzione:

num | name       |        sum
-   | -          |          -
1   | one        |       1243
2   | two        |      14234
3   | three      |       3324
Autore: 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

Articolo correlato - C IO