So formatieren Sie Zeichenfolgen mit printf(), um die gleiche Länge in der Ausgabe zu erhalten

Lesezeit: 3 Minuten

Benutzeravatar von psihodelia
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.

Wie bekomme ich so etwas wie das Folgende?

Starting initialization...       Ok.
Checking init scripts...         Ok.

Benutzeravatar von Carl Smotricz
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

Benutzeravatar von PP
PP.

printf ermöglicht die Formatierung mit Breitenbezeichnern. Zum Beispiel,

printf( "%-30s %s\n", "Starting initialization...", "Ok." );

Sie würden einen negativen Breitenbezeichner verwenden, um eine Linksbündigkeit anzugeben, da die Standardeinstellung die Rechtsbündigkeit ist.

Benutzeravatar von lifebalance
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."

Benutzeravatar von Patrick Schlüter
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.

Benutzeravatar von Peter Mortensen
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.

1421910cookie-checkSo formatieren Sie Zeichenfolgen mit printf(), um die gleiche Länge in der Ausgabe zu erhalten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy