HOWTO · C
Ausrichten von Spalten in der printf-Funktion in C
Dieser Artikel beschreibt, wie Sie Spalten in der printf-Funktion in C ausrichten können
Auf dieser Seite
Mit einer Feldbreite in printf lassen sich Spalten in C ausrichten. %10d richtet eine Ganzzahl in einem mindestens 10 Zeichen breiten Feld rechtsbündig aus; %*d übernimmt die Feldbreite aus einem Argument, und %0*d füllt eine Ganzzahl mit führenden Nullen auf. Verwende %-*s oder das Flag -, um Text in einer Tabelle linksbündig auszurichten.
Mit einer Feldbreite die Ausgabe in C ausrichten
Eine Feldbreite legt die Mindestanzahl der Zeichen fest, die für einen Wert verwendet wird. Bei einer Ganzzahl richtet %10d den Wert rechtsbündig aus und füllt links mit Leerzeichen auf, wenn er weniger als 10 Zeichen umfasst. Ein längerer Wert wird vollständig ausgegeben; die Feldbreite kürzt ihn also nicht. Das ist nützlich, wenn die letzten Zeichen einer Spalte untereinander stehen sollen: Kürzere Werte beginnen weiter rechts, da die Umwandlung standardmäßig rechtsbündig ist.
Dieses vollständige Beispiel zeigt die rechtsbündigen Werte neben einem sichtbaren Trennzeichen:
#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
Die erste Umwandlung reserviert eine Mindestbreite von 10 Zeichen; die zweite verwendet die natürliche Breite des Werts. Das Zeichen | macht die Feldgrenze sichtbar. Allgemein bezeichnet die Zahl in einem Format wie %10d die gesamte Mindestfeldbreite und nicht die Anzahl der hinzuzufügenden Leerzeichen.
%*d für eine dynamische Feldbreite verwenden
Verwende %*d, wenn die Feldbreite erst während der Programmausführung bekannt ist. Jedes * in einer Umwandlung verbraucht ein int-Argument, das unmittelbar vor dem Wert für diese Umwandlung steht. Zum Beispiel gibt bei printf("%*d", width, value) width die Feldbreite und value die Ganzzahl an.
Dieses vollständige Beispiel legt die Breite zur Laufzeit fest und übergibt sie unmittelbar vor jeder Ganzzahl:
#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
Die erste Umwandlung verwendet den Wert von width als Mindestfeldbreite. Daher erhalten kürzere Ganzzahlen führende Leerzeichen, während längere Werte vollständig erhalten bleiben. Die zweite Umwandlung gibt dieselbe Ganzzahl mit ihrer natürlichen Breite aus.
Das Flag - richtet den Wert linksbündig aus. Es lässt sich mit einer dynamischen Breite als %-*d kombinieren; das Breitenargument steht weiterhin vor dem Wertargument. Zum Beispiel verwendet printf("%*d | %-*d\n", width, value, width, value) width vor der jeweils zugehörigen Ganzzahl. Das erste Feld ist standardmäßig rechtsbündig, das zweite linksbündig. Wenn sich das Layout je Zeile ändert, übergib vor dem jeweiligen Wert eine andere Breite.
Feldbreiten kombinieren, um Tabellenspalten auszurichten
Gib Text- und Zahlenfeldern in einer gemischten Tabelle Breiten, die zu den vorgesehenen Spalten passen. Das Flag - richtet Beschriftungen linksbündig aus; Ganzzahlumwandlungen ohne dieses Flag richten Zahlen rechtsbündig aus. Ein Trennzeichen | hebt die Spalten voneinander ab. Bei %*.*d übernimmt das erste * die Breite, das zweite die Genauigkeit und das letzte Argument den Ganzzahlwert. Die Ganzzahlgenauigkeit legt eine Mindestanzahl von Ziffern fest und fügt bei Bedarf führende Nullen hinzu.
Dieses vollständige Tabellenbeispiel verwendet feste Spaltenbreiten für Überschriften und Beispielzeilen. Die sichtbaren Beschriftungen in den Code- und Ausgabeblöcken bleiben Englisch, da beide Blöcke unverändert übernommen werden:
#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
Die Zahlen- und Beschreibungsspalten sind hier linksbündig ausgerichtet, damit sich die Zeilen leichter überblicken lassen. Entferne - aus einer Ganzzahlumwandlung, um die betreffende Zahl stattdessen rechtsbündig auszurichten. Für jede mit * angegebene Breite oder Genauigkeit muss ein passendes int-Argument in derselben Reihenfolge vorhanden sein. Bei Text mit Mehrbyte- oder breiten Zeichen kann die Anzeige im Terminal abweichen. Deshalb verwenden diese byteorientierten Beispiele gewöhnlichen ASCII-Text.
%0*d für Ganzzahlen mit führenden Nullen verwenden
Verwende %0*d, wenn eine Ganzzahl eine Mindestbreite haben und mit führenden Nullen aufgefüllt werden soll. Das * verbraucht das Breitenargument vor der Ganzzahl. Anders als die Leerzeichenauffüllung mit %*d sorgt die Nullauffüllung dafür, dass numerische Kennungen und Zähler eine einheitliche Ziffernbreite haben.
Dieses vollständige Beispiel gibt zwei Ganzzahlen mit einer Mindestbreite von fünf Ziffern aus:
#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
Die Breite ist ein Mindestwert. Daher wird ein Wert mit mehr Ziffern als der festgelegten Breite trotzdem vollständig ausgegeben. Verwende in einer Tabelle für jede Zeile dieselbe numerische Breite und für Überschriften oder Text Felder, die mit Leerzeichen aufgefüllt werden.
Fazit
Wähle %10d oder eine andere feste Feldbreite, wenn das Layout bekannt ist. Verwende %*d, wenn die Breite aus einer Variablen stammt, und ergänze -, wenn ein Feld linksbündig ausgerichtet werden soll. Für numerische Kennungen oder Zähler, die führende Nullen benötigen, eignet sich %0*d. Mit diesen Formatangaben lässt sich gewöhnliche ASCII-Konsolenausgabe leichter überblicken; bei anderen Texten kann die Anzeigebreite des Terminals die Ausrichtung beeinflussen.