So formatieren Sie Zeichenfolgen mit printf(), um die gleiche Länge in der Ausgabe zu erhalten
Lesezeit: 3 Minuten
Psihodelie
Ich habe zwei Funktionen, eine, die Nachrichten wie erzeugt Starting initialization... und eine andere, die Rückgabecodes und Ausgaben prüft "Ok", "Warning" oder "Error". Die erzeugte Ausgabe ist jedoch unterschiedlich lang:
Starting initialization... Ok.
Checking init scripts... Ok.
Karl Smotricz
Sie können eine Breite für Zeichenfolgenfelder angeben, z
printf("%-20s", "initialization...");
Und dann wird alles, was mit diesem Feld gedruckt wird, auf die von Ihnen angegebene Breite mit Leerzeichen aufgefüllt.
Das - richtet Ihren Text in diesem Feld linksbündig aus.
Leider bin ich nicht schlau genug, so hoch zu zählen. Ich vertraue jedoch darauf, dass der Fragesteller intelligent genug ist, um aus meinem Beispiel zu extrapolieren 🙂
– Carl Smotricz
27. November 2009 um 16:03 Uhr
was ist mit rechts gerechtfertigt? In K&R werden keine Flags erwähnt
– Ungeheuer
30. März 2017 um 18:35 Uhr
Rechtsbündig ist die Standardeinstellung. Ohne ein -werden Ihre Daten rechtsbündig in einem Feld angezeigt, dessen Breite Sie angegeben haben.
– Carl Smotricz
3. April 2017 um 18:12 Uhr
PP.
printf ermöglicht die Formatierung mit Breitenbezeichnern. Zum Beispiel,
Sie würden einen negativen Breitenbezeichner verwenden, um eine Linksbündigkeit anzugeben, da die Standardeinstellung die Rechtsbündigkeit ist.
Lebensbalance
Wenn Sie außerdem die Flexibilität bei der Auswahl wünschen widthkönnen Sie zwischen einem der beiden folgenden Formate (mit oder ohne Trunkierung) wählen:
int width = 30;
// No truncation uses %-*s
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." );
// Output is "Starting initialization... Ok."
// Truncated to the specified width uses %-.*s
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." );
// Output is "Starting initialization... Ok."
Patrick Schlüter
Es gibt auch die %n Modifikator, der unter bestimmten Umständen helfen kann. Es gibt die Spalte zurück, auf der sich der String bisher befand. Beispiel: Sie möchten mehrere Zeilen, die innerhalb der Breite der ersten Zeile liegen, wie eine Tabelle schreiben.
int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|\n", header1, &width1, header2, &width2);
for(i=0; i<6; i++)
printf("|%*d|%*d|\n", width1, values[i][0], width2, values[i][1]);
druckt zwei Spalten der gleichen Breite, unabhängig von der Länge der beiden Zeichenfolgen header1 und header2 könnte haben. Ich weiß nicht, ob alle Implementierungen die haben %naber Solaris und Linux tun.
Es gibt auch die eher Low-Tech-Lösung, Leerzeichen von Hand zu zählen, um Ihre Nachrichten auszurichten. Nichts hindert Sie daran, ein paar nachgestellte Leerzeichen in Ihre Nachrichtenzeichenfolgen einzufügen.
Peter Mortensen
Beginnen Sie mit der Verwendung von Registerkarten – das \t Zeichenmodifikator. Es wird zu einem festen Ort vorgerückt (Spalten, Terminaljargon).
Allerdings hilft es nichts, wenn es Unterschiede von mehr als der Spaltenbreite (4 Zeichen, wenn ich mich richtig erinnere) gibt.
Um das zu beheben, schreiben Sie Ihr “OK/NOK”-Zeug mit einer festen Anzahl von Tabulatoren (5? 6?, versuchen Sie es). Dann zurück (\r) ohne Zeilenumbruch und schreiben Sie Ihre Nachricht.
14219100cookie-checkSo formatieren Sie Zeichenfolgen mit printf(), um die gleiche Länge in der Ausgabe zu erhaltenyes