2009-11-17 4 views
64

Ich habe die folgende Aussage:In C kann eine lange Printf-Anweisung in mehrere Zeilen aufgeteilt werden?

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", sp->name, sp->args, sp->value, sp->arraysize); 

ich es brechen wollen. Ich habe Folgendes versucht, aber es funktioniert nicht.

printf("name: %s\t 
args: %s\t 
value %d\t 
arraysize %d\n", 
sp->name, 
sp->args, 
sp->value, 
sp->arraysize); 

Wie kann ich es aufteilen?

+0

Einige gute Vorschläge gegeben, aber keiner von ihnen kann so klar oder wartbar sein wie nur vier separate printf() -Aufrufe. – Clifford

+0

@Clifford: Dann könnten Sie C++ schreiben, damit Cout besser für Sie aussieht. – Test

Antwort

134

Wenn Sie einen Stringliteral auf mehrere Zeilen brechen wollen, können Sie zusammen mehr Strings verketten, eine auf jeder Linie, etwa so:

printf("name: %s\t" 
"args: %s\t" 
"value %d\t" 
"arraysize %d\n", 
sp->name, 
sp->args, 
sp->value, 
sp->arraysize); 
+71

nur kommentieren, um die wenig bekannte C-Tatsache zu erklären, dass Whitespace zwischen zwei Strings Verkettung ist. –

+0

Wie genau hat das den Code _more_ lesbar gemacht? – Lundin

+1

@Lundin Es ist viel einfacher für mich, jede Variable und ihren Wert klar in einer eigenen Zeile darzustellen. Können Sie sich einen Debugger in einer IDE vorstellen, der alle Variablen und Werte auf eine einzige Zeile setzt? Ich kann nicht. _ (Ja, ich weiß, dass zwischen jeder Zeichenfolge keine Zeilenumbrüche stehen, aber ich vergleiche die Lesbarkeit des Quellcodes mit der Lesbarkeit der Variablen in einem Debugger) _ – byxor

18

Nur ein paar andere Formatierungsoptionen:

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", 
     a,  b,  c,  d); 

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", 
       a,  b,  c,   d); 

printf("name: %s\t"  "args: %s\t"  "value %d\t"  "arraysize %d\n", 
     very_long_name_a, very_long_name_b, very_long_name_c, very_long_name_d); 

Sie können Variationen zum Thema hinzufügen. Die Idee ist, dass die printf() Konvertierungsspezialisten und die entsprechenden Variablen "nett" aneinandergereiht sind (für einige Werte von "nett").

+0

Nichts funktionierendes hier, aber eine neue Idee, die ich nie zuvor gesehen habe. Ich mag es, großer Kommentar @pmg! – rpj

16

können die C-Compiler benachbarte Stringliterale in eine, wie

printf("foo: %s " 
     "bar: %d", foo, bar); 

Der Präprozessor Klebten einen umgekehrten Schrägstrich als letztes Zeichen der Zeile verwenden, nicht CR Zählen (oder CR/LF, wenn Sie sind Windowsland):

printf("foo %s \ 
bar: %d", foo, bar); 
+6

Die erste wurde bereits vorgeschlagen, die zweite leidet unter der Tatsache, dass sie bricht, wenn es ein Leerzeichen * nach dem '\' gibt; ein Fehler, der beim Auftreten des Problems verblüffen kann. – Clifford

+1

Keines dieser beiden Beispiele hat irgendetwas mit dem C-Präprozessor zu tun. –

+0

@Dan mein cpp scheint zu verstehen/(siehe meine Bearbeitung oben). Ich bin mir nicht sicher, ob das Standardverhalten ist. – sigjuice

2

ich glaube nicht eine printf Anweisung Stringliterale zu drucken, wie oben zu sehen ist eine gute Programmierpraxis; vielmehr kann man das Stück Code unten verwenden:

2

Die de-facto-Standard Art und Weise komplexe Funktionen in C pro Argument ist aufzuspalten:

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", 
     sp->name, 
     sp->args, 
     sp->value, 
     sp->arraysize); 

Oder wenn man so will:

const char format_str[] = "name: %s\targs: %s\tvalue %d\tarraysize %d\n"; 
... 
printf(format_str, 
     sp->name, 
     sp->args, 
     sp->value, 
     sp->arraysize); 

Sie sollten die Zeichenfolge nicht teilen, noch sollten Sie \ verwenden, um eine C-Zeile zu unterbrechen. Ein solcher Code wird schnell vollständig unlesbar/nicht mehr erreichbar.

Verwandte Themen