Linker Ausdruck mit Leerzeichen

113

Wie kann ich bei Verwendung von printf eine Zeichenfolge mit Leerzeichen links auffüllen?

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

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

EDIT: Um ganz klar zu sein, ich möchte genau 40 Leerzeichen vor jeder Zeile drucken.

Titandecoy
quelle

Antworten:

124

Wenn Sie möchten, dass das Wort "Hallo" in einer 40 Zeichen breiten Spalte mit Leerzeichen links gedruckt wird, verwenden Sie Folgendes.

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

Das gibt Ihnen 35 Leerzeichen, dann das Wort "Hallo". Auf diese Weise formatieren Sie Inhalte, wenn Sie wissen, wie breit die Spalte sein soll, aber die Daten sich ändern (nun, es ist eine Möglichkeit, dies zu tun).

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

Bill die Eidechse
quelle
3
Keine Ahnung zu viel über Formatflags. aber ich vermute printf ("% 40s% s \ n", "", ptr); kann es auch mit 40 Leerzeichen aufgefüllt werden?
Johannes Schaub - Litb
Ja, das würde Ihnen immer 40 Leerzeichen vor dem Inhalt des Zeigers geben. Das ist eine schöne Lösung, aber wenn Sie viel tun müssen, wäre eine Konstante mit 40 Leerzeichen meiner Meinung nach schneller. Ich weiß nicht, ob der Compiler die printf-Formate optimieren kann.
Bill the Lizard
38
Wenn Sie eine int-Variable 'n' haben, die die Anzahl der einzuschließenden Leerzeichen enthält, können Sie Folgendes verwenden: printf ("% * s% s \ n", n, "", ptr); um eine variable Anzahl von Leerzeichen zu erhalten.
Jonathan Leffler
Und um den letzten Teil des Q zu adressieren: Ja, wenn Sie möchten, dass jede Zeile der Daten mit 40 führenden Leerzeichen gedruckt wird, müssen Sie die Daten so segmentieren, dass jede Zeile separat gedruckt wird.
Jonathan Leffler
4
@ Jonathan Leffler: Natürlich kann der Compiler die Druckformate optimieren. Zum Beispiel optimiert GCC printf ("% s \ n", foo) und ersetzt es durch Puts (foo).
Sam Hocevar
73

Ich benutze diese Funktion, um meine Ausgabe einzurücken (zum Beispiel um eine Baumstruktur zu drucken). Das indentist die Anzahl der Leerzeichen vor der Zeichenfolge.

void print_with_indent(int indent, char * string)
{
    printf("%*s%s", indent, "", string);
}
jk_
quelle
7
Ich mag Ihre Verwendung der Verkettung von Zeichenfolgenliteralen, um die Einrückung vom Rest des printf-Formats zu trennen. Ein Vorschlag: Verwenden Sie eine leere Zeichenfolge anstelle eines einzelnen Leerzeichens für die Einrückungszeichenfolge. Auf diese Weise funktioniert der Einzug == 0 wie erwartet. (dh printf(..., indent, "", ...))
ɲeuroburɳ
Beachten Sie, dass Ray Hulha die Verkettung von Zeichenfolgenliteralen entfernt hat, um offensichtlich ein "Compiler-Problem" zu beheben.
mwfearnley
41
int space = 40;
printf("%*s", space, "Hello");

Diese Anweisung reserviert eine Zeile mit 40 Zeichen und druckt eine Zeichenfolge am Ende der Zeile (wobei zusätzliche Leerzeichen entfernt werden, sodass die Gesamtzeilenlänge konstant bei 40 liegt). Gleiches kann für Zeichen und ganze Zahlen wie folgt verwendet werden:

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

Diese Methode, bei der ein Parameter zum Bestimmen von Leerzeichen verwendet wird, ist nützlich, wenn eine variable Anzahl von Leerzeichen erforderlich ist. Diese Anweisungen funktionieren weiterhin mit ganzzahligen Literalen wie folgt:

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

Hoffe das hilft jemandem wie mir in Zukunft.

Rece Foc
quelle
Ich habe error: empty character constantfür ''. Sollte es nicht sein ' '?
Jin Kwon
Ja, das sollte es.
Shjeff
@ JinKwon jeder Charakter, genau wie "Hello"alles sein könnte, hätte er ein Beispiel verwenden sollen
Joe Pelletier
19

Wenn Sie genau 40 Leerzeichen vor dem String haben möchten, sollten Sie einfach Folgendes tun:

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

Wenn das zu schmutzig ist, können Sie dies tun (aber es ist langsamer als das manuelle Eingeben der 40 Leerzeichen): printf("%40s%s", "", myStr );

Wenn Sie möchten, dass die Zeichenfolge in Spalte 40 ausgerichtet wird (dh bis zu 39 Leerzeichen, so dass das Zeichen ganz rechts in Spalte 40 steht), gehen Sie folgendermaßen vor: printf("%40s", myStr);

Sie können auch "bis zu" 40 Leerzeichen nach dem String einfügen, indem Sie Folgendes tun: printf("%-40s", myStr);

Seifenkiste
quelle
2
wie dieser Kommentar für Leerzeichen nach der Zeichenfolge
Uhr