2008-11-16 7 views
76

Wie kann ich einen String mit Leerzeichen auf der linken Seite auffüllen, wenn Sie printf verwenden?Left-Pad printf mit Leerzeichen

Zum Beispiel möchte ich "Hallo" mit 40 Leerzeichen davor drucken.

Auch die Zeichenfolge, die ich drucken möchte, besteht aus mehreren Zeilen. Muss ich jede Zeile einzeln drucken?

EDIT: Nur um klar zu sein, ich möchte genau 40 Leerzeichen vor jeder Zeile gedruckt werden.

Antwort

81

Wenn Sie möchten, dass das Wort "Hello" in einer 40 Zeichen breiten Spalte mit Leerzeichen auf der linken Seite gedruckt wird, verwenden Sie Folgendes.

char *ptr = "Hello"; 
printf("%40s\n", ptr); 

Das wird Ihnen 35 Leerzeichen geben, dann das Wort "Hallo". Dies ist, wie Sie Zeug formatieren, wenn Sie wissen, wie breit Sie die Spalte wollen, aber die Daten ändert sich (nun, es ist eine Weise, wie Sie es tun können).

Wenn Sie wissen, dass Sie genau 40 Leerzeichen möchten, dann etwas Text, speichern Sie einfach die 40 Leerzeichen in einer Konstante und drucken Sie sie aus. Wenn Sie mehrere Zeilen drucken müssen, verwenden Sie entweder mehrere printf-Anweisungen wie die obige oder führen Sie sie in einer Schleife aus, wobei Sie den Wert ptr jedes Mal ändern.

+3

weiß ich nicht zu viel über Format Flags. aber ich vermute printf ("% 40s% s \ n", "", ptr); Kann man sie auch mit 40 Feldern füllen? –

+0

Ja, das würde Ihnen immer 40 Leerzeichen vor dem Inhalt des Zeigers geben. Das ist eine nette Lösung, aber wenn man es viel machen muss, wäre eine Konstante mit 40 Leerzeichen schneller.Ich weiß nicht, ob der Compiler Printf-Formate optimieren kann. –

+2

@Bill: Der Compiler kann printf() - Formate nicht optimieren. –

13

Wenn Sie genau 40 Leerzeichen vor der Zeichenfolge wollen, dann sollten Sie gerade tun:

printf("          %s\n", myStr); 

Wenn das zu schmutzig ist, können Sie dies tun (aber es wird langsamer sein als manuell die 40 Räume eingeben): printf("%40s%s", "", myStr);

Wenn Sie die Zeichenfolge wollen 40 in Spalte aufgereiht werden (das heißt, bis zu 39 Räumen verläuft es so, dass die am weitesten rechts stehenden Zeichen in Spalte 40) dies dann tun: printf("%40s", myStr);

Sie können auch „bis zu“ 40 Räume nach der Zeichenfolge setzen, indem Sie: printf("%-40s", myStr);

+0

mag diesen Kommentar für Leerzeichen nach der Zeichenfolge – oneat

49

Ich benutze diese Funktion meine Ausgabe einrücken (zum Beispiel einer Baumstruktur drucken). Die indent ist die Anzahl der Leerzeichen vor der Zeichenfolge.

void print_with_indent(int indent, char * string) 
{ 
    printf("%*s%s", indent, "", string); 
} 
+6

Ich mag Ihre Verwendung von Zeichenfolge literalen Verkettung, um den Eindruck getrennt von dem Rest des Printf-Format zu halten. Ein Vorschlag: Verwenden Sie eine leere Zeichenfolge anstelle eines einzelnen Leerzeichens für die Einzugsstring. Auf diese Weise funktioniert der Einzug == 0 wie erwartet. (d. h. 'printf (..., indent," ", ...)') –

+0

Dies ist genau die Funktion, die ich schreiben wollte! – Elemental

+0

Hinweis, Ray Hulha hat die String-Literal-Verkettung offenbar entfernt, um ein "Compiler-Problem" zu beheben. – mwfearnley

18
int space=40; 
printf("%*s",space,"Hello"); 

am Ende der Kolonne (nicht nach der Spalte, in der letzten columns.Total Anzahl der Spalten verwendet wird noch 40 sein) eine Spalte von 40 Zeichen, Druckzeichenfolge reserviert Diese Erklärung wird. Gleiches gilt für die Ziffern und Zahlen verwendet werden, wie

printf("%*d",space,10); 
printf("%*c",space,''); 

Diese Methode der Verwendung von variablen Räumen nützlich folgt in Funktion aufruft, wo variable Anzahl von Räumen required.These Aussagen ist noch mit konstanten Zahlen arbeiten, wie

folgt
printf("%*d",10,10); 
printf("%*c",20,''); 
printf("%*s",30,"Hello"); 

Hoffen, dass dies jemand wie ich in Zukunft hilft.