85 Stimmen

Aufteilen von C++-Zeichenketten auf mehrere Zeilen (Code-Syntax, nicht Analyse)

Nicht zu verwechseln mit der Aufteilung eines Strings nach Parsing, z. B .:
String in C++ teilen?

Ich bin ein wenig verwirrt darüber, wie ich einen String in C++ auf mehrere Zeilen aufteile.

Dies klingt nach einer einfachen Frage, aber nehmen wir das folgende Beispiel:

#include 
#include 
main() {
  //Gibt Fehler aus
  std::string my_val ="Hallo Welt, das ist ein überlanges Stringbeispiel, um" +
    " nur eine Zeile zu haben";
  std::cout << "Mein Wert ist: " << my_val << std::endl;

  //Gibt Fehler aus
  std::string my_val ="Hallo Welt, das ist ein überlanges Stringbeispiel, um" &
    " nur eine Zeile zu haben";  
  std::cout << "Mein Wert ist: " << my_val << std::endl;
}

Ich weiß, dass ich die std::string append()-Methode verwenden könnte, aber ich frage mich, ob es einen kürzeren/eleganteren Weg (z. B. eher wie in Python, obwohl offensichtlich Triple Quotes usw. in C++ nicht unterstützt werden) gibt, um Zeichenfolgen in C++ für die Lesbarkeit auf mehrere Zeilen aufzuteilen.

Ein Ort, an dem dies besonders wünschenswert wäre, ist, wenn Sie lange Zeichenfolgenliterale an eine Funktion weitergeben (zum Beispiel einen Satz).

142voto

Eclipse Punkte 43775

Geben Sie nichts zwischen die Zeichenfolgen ein. Ein Teil der C++-Lexing-Stufe besteht darin, benachbarte Zeichenfolgenliterale (auch über Zeilenumbrüche und Kommentare hinweg) zu einem einzelnen Literal zu kombinieren.

#include 
#include 
main() {
  std::string my_val ="Hallo Welt, das ist eine übermäßig lange Zeichenfolge, die" 
    " nur in einer Zeile steht";
  std::cout << "My Val is : " << my_val << std::endl;
}

Beachten Sie, dass Sie, wenn Sie einen Zeilenumbruch im Literal haben möchten, diesen selbst hinzufügen müssen:

#include 
#include 
main() {
  std::string my_val ="Diese Zeichenfolge wird über\n" 
    "zwei Zeilen angezeigt, wenn sie an cout übergeben wird.";
  std::cout << "My Val is : " << my_val << std::endl;
}

Wenn Sie einen #defined Ganzzahlenkonstanten in das Literal mischen möchten, müssen Sie einige Makros verwenden:

#include 
using namespace std;

#define TWO 2
#define XSTRINGIFY(s) #s
#define STRINGIFY(s) XSTRINGIFY(s)

int main(int argc, char* argv[])
{
    std::cout << "abc"   // Gibt "abc2DEF" aus
        STRINGIFY(TWO)
        "DEF" << endl;
    std::cout << "abc"   // Gibt "abcTWODEF" aus
        XSTRINGIFY(TWO) 
        "DEF" << endl;
}

Es gibt einige Eigenheiten aufgrund der Funktionsweise des Stringifizierungsprozessors, daher benötigen Sie zwei Ebenen von Makros, um den tatsächlichen Wert von TWO in ein Zeichenkettenliteral umzuwandeln.

10voto

Matt K Punkte 12783

Sind sie beide Literale? Das Trennen von zwei Zeichenfolgen-Literalen durch Leerzeichen entspricht der Verkettung: "abc" "123" ist dasselbe wie "abc123". Dies gilt sowohl für gerades C als auch für C++.

7voto

rmeador Punkte 25087

Ich weiß nicht, ob es sich um eine Erweiterung in GCC handelt oder ob es Standard ist, aber anscheinend können Sie eine Zeichenfolge fortsetzen, indem Sie die Zeile mit einem Backslash beenden (genauso wie die meisten Arten von Zeilen in C++ auf diese Weise erweitert werden können, z.B. ein Makro, das über mehrere Zeilen reicht).

#include 
#include 

int main ()
{
    std::string str = "Hallo Welt\
    das scheint zu funktionieren";

    std::cout << str;
    return 0;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X