Definition eines Strings über mehrere Zeilen

Lesezeit: 3 Minuten

Benutzeravatar von Nanomurf
Nanomurf

Bitte nehmen Sie folgendes:

char buffer[512];

memset(buffer, 0, sizeof(buffer));
sprintf(&buffer[0],"This Is The Longest String In the World that in text goes on and..");

printf("Buffer:%s\r\n",buffer);

Ich möchte diese Zeichenfolge über mehrere Zeilen erstellen können, um die Fehlerbehebung und Bearbeitung zu vereinfachen. Wenn ich jedoch die nutze \ Befehl meine Ausgabe durch scheinbar Tabulatoren getrennt ist?

Beispiel:

sprintf(&buffer[0],"This Is The\
    Longest String In the World\
    that in text goes on and..");

ergibt eine Ausgabe von:

Buffer:This Is The        Longest String In the World       that in text goes on and..

Irgendwelche Ideen? Ist dies nur ein falscher Ansatz, um zu versuchen, eine Zeichenfolge in mehrere Codezeilen aufzuteilen?

  • Sie sollten nicht verwenden \r In printf

    – MM

    29. Dezember 2015 um 2:24 Uhr

  • Mögliches Duplikat von How to split a string literal across multiple lines in C/Objective-C?

    – Ciro Santilli OurBigBook.com

    8. April 2017 um 4:45 Uhr

Benutzeravatar von pb2q
pb2q

Die Newline-Fortsetzung berücksichtigt alle Leerzeichen innerhalb des Codes.

Sie können die Vorteile der String-Literal-Verkettung für eine bessere Lesbarkeit nutzen:

sprintf(buffer, "This Is The "
                "Longest String In the World "
                "that in text goes on and..");

Verwenden \ Sie müssen die Fortsetzung Ihrer Zeichenfolge in Spalte 0 beginnen:

sprintf(buffer, "This Is The \
Longest String In the World \
that in text goes on and..");

  • Stirn geschlagen. Auto-Tabbing hat mich fertig gemacht! Danke für den Hinweis, das war tatsächlich das Problem.

    – Nanomurf

    2. Oktober 2012 um 17:08 Uhr

Obwohl dies pedantisch erscheinen mag, wurde ich in der realen Welt oft genug gebissen, um die folgenden Probleme mit den anderen beiden geposteten Antworten zu haben.

  • Die beiden geposteten Antworten vernachlässigen es, Leerzeichen zwischen den Wörtern zu geben, die die separaten Zeichenfolgenliterale verbinden (offensichtlich nach dem ersten Test).

  • Wenn Ihre Schnur wirklich lang ist, verwenden Sie snprintf() stattdessen – es ist etwas umständlicher, aber es sagt jedem, der Ihren Code überprüft, dass Sie sich der allgemeinen Gefahren bei der Codewartung bewusst sind.

  • Wenn Ihre Zeichenfolge zufällig enthält %, erhalten Sie eine Compiler-Warnung (gut) oder zufällige Segmentierungsfehler (schlecht). Also verwenden "%s" oder, vielleicht in diesem Fall, nur strcpy(). (In zwei Monaten könnte ein Kollege leicht hinzufügen 99.9% zur Nachricht.)

  • Die Verwendung von memset(), Was ich oft sehe, ist nur Cargo-Kult-Programmierung. Ja, in besonderen Fällen braucht man es, aber es ständig zu verwenden, sendet die falsche Botschaft.

  • Und schließlich, warum sollte jemand verwenden &buffer[0] wann gerade buffer
    würdest du?

Zusammenfassend sollte Ihr Code also vielleicht lauten:

char buffer[512];
snprintf(buffer, sizeof buffer, "%s", 
   "This is The Longest String "
   "In the World that in text "
   "goes on and on and on and on ....");
printf("Buffer:%s\r\n", buffer);

  • Das sind alles sehr gute Punkte. Vielen Dank, dass Sie sich die Zeit genommen haben, sie zu machen. Der obige Code ist wirklich nur ein Beispiel dafür, womit ich es zu tun habe, aber alle Punkte, die Sie hier aufgelistet haben, sind sehr gültig. Und um deine letzte Frage zu beantworten: Ich bin kein eleganter Programmierer, verlasse mich also oft auf rohe Gewalt. >< Ich freue mich über das Feedback!

    – Nanomurf

    2. Oktober 2012 um 18:29 Uhr

  • @JosephQuinsey Ich hielt es nicht für notwendig, obwohl Sie mich auf Mängel in meiner Antwort aufmerksam gemacht haben. Das Ziel auf dieser Seite sind gute Fragen und Antworten, und jeder muss auf seinen Verdiensten stehen, auch wenn das bedeutet, nützliche Teile anderer Antworten zu synthetisieren, und ich @ zitiere oft keine anderen Benutzer. Allerdings ist der Input aus Ihrem Kommentar auch für mich nützlich, und ich entschuldige mich dafür.

    – pb2q

    2. Oktober 2012 um 21:07 Uhr


  • @pb2q: Danke für deine sehr anmutige Antwort.

    – Joseph Quinsey

    2. Oktober 2012 um 21:12 Uhr

  • stimme den ersten 4 Punkten zu, aber ich denke &x[0] ist kein Fehler und gibt klar an, was passiert.

    – MM

    29. Dezember 2015 um 2:25 Uhr

Auch das würde genauso gut funktionieren:

char buffer[512];
sprintf(&buffer[0], "This is the longest string"
        "in the world that in text"
        "goes on and on and on and on ....");
printf("%s\n", buffer);

1443970cookie-checkDefinition eines Strings über mehrere Zeilen

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

Privacy policy