HOWTO · C
Allinea colonne nella funzione printf in C
Questo articolo introduce come allineare le colonne nella funzione printf in C
In questa pagina
Usa una larghezza di campo di printf per allineare le colonne in C. %10d allinea un intero a destra in un campo largo almeno 10 caratteri; %*d riceve la larghezza da un argomento, mentre %0*d aggiunge zeri iniziali a un intero. Usa %-*s o il flag - per allineare il testo a sinistra in una tabella.
Usa una larghezza di campo per allineare l’output in C
La larghezza di campo stabilisce il numero minimo di caratteri riservati a un valore. Per un intero, %10d allinea il valore a destra e aggiunge spazi a sinistra se occupa meno di 10 caratteri. Se il valore è più lungo, viene stampato per intero: la larghezza non lo tronca. Questa impostazione è utile quando si vuole allineare l’ultima cifra di una colonna; i valori più brevi iniziano più a destra perché la conversione è allineata a destra.
Questo esempio completo mostra i valori allineati a destra accanto a un separatore visibile:
#include <stdio.h>
int main(void) {
int values[] = {11011, 111, 11};
for (int i = 0; i < 3; ++i) {
printf("%10d | %d\n", values[i], values[i]);
}
return 0;
}
11011 | 11011
111 | 111
11 | 11
La prima conversione riserva una larghezza minima di 10; la seconda usa la larghezza naturale del valore. Il carattere | rende visibile il limite del campo. In generale, il numero in un formato come %10d indica la larghezza minima totale del campo, non il numero di spazi da aggiungere.
Usa %*d per una larghezza di campo dinamica
Usa %*d quando la larghezza del campo è nota solo durante l’esecuzione del programma. Ogni * in una conversione consuma un argomento int immediatamente prima del valore della conversione. Per esempio, in printf("%*d", width, value), width specifica la larghezza del campo e value fornisce l’intero.
Questo esempio completo imposta la larghezza durante l’esecuzione e la passa immediatamente prima di ciascun valore intero:
#include <stdio.h>
int main(void) {
int width = 10;
int values[] = {11011, 111, 11};
for (int i = 0; i < 3; ++i) {
printf("%*d | %d\n", width, values[i], values[i]);
}
return 0;
}
11011 | 11011
111 | 111
11 | 11
La prima conversione usa il valore di width come larghezza minima del campo: gli interi più brevi ricevono spazi iniziali, mentre i valori più lunghi restano intatti. La seconda conversione stampa lo stesso intero con la sua larghezza naturale.
Il flag - allinea il valore a sinistra. Può essere combinato con una larghezza dinamica, come in %-*d; l’argomento della larghezza resta prima di quello del valore. Per esempio, printf("%*d | %-*d\n", width, value, width, value) usa width prima di ciascun intero corrispondente. Il primo campo è allineato a destra per impostazione predefinita, il secondo a sinistra. Se il layout cambia da una riga all’altra, passa una larghezza diversa prima del relativo valore.
Combina larghezze di campo per allineare le colonne di una tabella
In una tabella con contenuti misti, assegna ai campi di testo e numerici larghezze adatte alle colonne desiderate. Il flag - allinea le etichette a sinistra, mentre le conversioni di interi senza questo flag allineano i numeri a destra. Un separatore | distingue le colonne. Con %*.*d, il primo * consuma la larghezza, il secondo la precisione e l’ultimo argomento fornisce il valore intero. La precisione degli interi imposta un numero minimo di cifre e aggiunge zeri iniziali quando necessario.
Questo esempio completo di tabella usa colonne di larghezza fissa per le intestazioni e le righe di esempio. Le etichette visibili restano in inglese, perché i blocchi di codice e di output sono mantenuti invariati:
#include <stdio.h>
int main(void) {
int width = 12;
printf("%-*s | %-*s | %*s\n", width, "Number", width,
"Description", width, "Value");
printf("%-*d | %-*s | %*.*d\n", width, 123, width, "First",
width, 4, 4567);
printf("%-*d | %-*s | %*.*d\n", width, 456, width, "Second",
width, 4, 789);
return 0;
}
Number | Description | Value
123 | First | 4567
456 | Second | 0789
Qui le colonne dei numeri e delle descrizioni sono allineate a sinistra per rendere più facile la lettura delle righe; rimuovi - da una conversione di intero per allineare quel numero a destra. A ogni larghezza o precisione fornita con * deve corrispondere un argomento int, nello stesso ordine. La larghezza visualizzata nel terminale può variare per il testo con caratteri multibyte o a larghezza doppia; per questo gli esempi, basati sui byte, usano testo ASCII ordinario.
Usa %0*d per aggiungere zeri iniziali agli interi
Usa %0*d quando un intero deve avere una larghezza minima riempita con zeri iniziali. * consuma l’argomento della larghezza prima dell’intero. A differenza degli spazi aggiunti da %*d, gli zeri iniziali mantengono identificatori numerici e conteggi a una larghezza in cifre costante.
Questo esempio completo stampa due interi con una larghezza minima di cinque cifre:
#include <stdio.h>
int main(void) {
int width = 5;
printf("%0*d\n", width, 123);
printf("%0*d\n", width, 7);
return 0;
}
00123
00007
La larghezza è minima: un valore con più cifre della larghezza scelta viene comunque stampato per intero. In una tabella, applica la stessa larghezza numerica a ogni riga e usa campi riempiti con spazi per le intestazioni o il testo.
Conclusione
Scegli %10d o un’altra larghezza di campo fissa quando il layout è noto. Usa %*d quando la larghezza dipende da una variabile e aggiungi - quando un campo deve essere allineato a sinistra. Usa %0*d per identificatori numerici o conteggi che richiedono zeri iniziali. Queste scelte di formato rendono più leggibile il normale output ASCII in console, anche se la larghezza dei caratteri visualizzati dal terminale può influire sull’allineamento di altri testi.