Kann in C eine lange printf-Anweisung in mehrere Zeilen aufgeteilt werden?

Lesezeit: 4 Minuten

Benutzeravatar des Neuromancers
Neuromant

Ich habe folgende Aussage:

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

Ich möchte es auflösen. 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 auflösen?

  • Es wurden einige gute Vorschläge gemacht, aber keiner von ihnen ist möglicherweise so klar oder wartbar wie nur vier separate Aufrufe von printf().

    – Clifford

    17. November 2009 um 23:45 Uhr

  • @Clifford: dann könntest du C++ schreiben, damit cout für dich besser aussieht.

    – Prüfen

    18. November 2009 um 7:17 Uhr

Wenn Sie ein Zeichenfolgenliteral auf mehrere Zeilen aufteilen möchten, können Sie mehrere Zeichenfolgen miteinander verketten, eine in jeder Zeile, wie folgt:

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

  • nur kommentieren, um die wenig bekannte C-Tatsache zu erklären, dass Leerzeichen zwischen zwei Zeichenfolgen eine Verkettung sind.

    – Brian Postow

    17. November 2009 um 22:00 Uhr

  • @Lundin Jede Variable und ihren Wert klar in einer eigenen Zeile darzustellen, ist für mich viel einfacher zu lesen. Können Sie sich einen Debugger in einer IDE vorstellen, der alle Variablen und Werte in einer einzigen Zeile ablegt? Ich kann nicht. (Ja, ich weiß, dass keine Zeilenumbrüche zwischen die einzelnen Zeichenfolgen eingefügt werden, aber ich vergleiche die Lesbarkeit des Quellcodes mit der Lesbarkeit von Variablen in einem Debugger.)

    – byxor

    11. Juli 2017 um 16:33 Uhr


  • Wird diese Verkettung vom Präprozessor vorgenommen?

    – Debüt

    5. Dezember 2017 um 15:07 Uhr

Benutzeravatar von qrdl
qrdl

Der C-Compiler kann benachbarte String-Literale zu einem zusammenfügen, wie z

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

Der Präprozessor kann einen umgekehrten Schrägstrich als letztes Zeichen der Zeile verwenden, wobei CR (oder CR/LF, wenn Sie aus Windowsland stammen) nicht mitgezählt wird:

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

  • Das erste wurde bereits vorgeschlagen, das zweite leidet darunter, dass es bricht, wenn es irgendwelche Leerzeichen gibt nach das ‘\’; ein Fehler, der verwirrend sein kann, wenn er auftritt.

    – Clifford

    17. November 2009 um 23:43 Uhr

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

    – Dan Formen

    18. November 2009 um 5:15 Uhr

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

    – Sigissaft

    18. November 2009 um 7:12 Uhr

  • @Dan Während das Verbinden benachbarter Literale entweder mit dem Präprozessor oder dem Compiler durchgeführt werden kann (in der letzten Phase vor der eigentlichen Kompilierung), wird die Behandlung der Zeilenfortsetzung vom Präprozessor durchgeführt, da sonst mehrzeilige Makros nicht implementiert werden können. Siehe auch hier – gcc.gnu.org/onlinedocs/cpp/Initial-processing.html

    – qrdl

    18. November 2009 um 8:23 Uhr

  • @qrdl: Mein Fehler, du hast Recht mit dem zweiten. Die Zeilenfortsetzung erfolgt immer durch den Präprozessor. Manchmal muss ich daran erinnert werden, dass ich es bin nicht ein Besserwisser 😉 Ich denke aber immer noch, dass der Compiler im Normalfall String-Literale zusammenfügt.

    – Dan Formen

    18. November 2009 um 18:40 Uhr

Nur einige 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() Conversion-Spezifizierer und die entsprechenden Variablen sind alle “nicely” (für einige Werte von “nicely”) aufgereiht.

  • Nichts Funktionales hier, aber eine neuartige Idee, die ich noch nie zuvor gesehen habe. Gefällt mir, toller Kommentar @pmg!

    – rpj

    19. November 2009 um 3:07 Uhr

Der De-facto-Standard zum Aufteilen komplexer Funktionen in C ist pro Argument:

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

Oder wenn Sie wollen:

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 aufteilen oder verwenden \ eine C-Linie zu brechen. Solcher Code wird schnell völlig unlesbar/nicht mehr wartbar.

Benutzeravatar von antoine mabula
antoine mabula

Ich denke nicht, dass man einen benutzt printf Die Anweisung zum Drucken von Zeichenfolgenliteralen wie oben gezeigt ist eine gute Programmierpraxis. Stattdessen kann man den folgenden Code verwenden:

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

1421520cookie-checkKann in C eine lange printf-Anweisung in mehrere Zeilen aufgeteilt werden?

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

Privacy policy