Разделение строк C ++ на несколько строк (синтаксис кода, без разбора) - PullRequest
62 голосов
/ 05 октября 2010

Не путать с тем, как разбить строку, например:
Разделить строку в C ++?

Я немного запутался, как разбить строкустрока на несколько строк в c ++.

Это звучит как простой вопрос, но возьмите следующий пример:

#include <iostream>
#include <string>
main() {
  //Gives error
  std::string my_val ="Hello world, this is an overly long string to have" +
    " on just one line";
  std::cout << "My Val is : " << my_val << std::endl;

  //Gives error
  std::string my_val ="Hello world, this is an overly long string to have" &
    " on just one line";  
  std::cout << "My Val is : " << my_val << std::endl;
}

Я понимаю, что могу использовать метод std::string append(),но мне было интересно, есть ли какой-нибудь более короткий / более элегантный (например, более похожий на python, хотя в c ++ явно не поддерживаются тройные кавычки и т. д.) для разбивки строк в c ++ на несколько строк для удобства чтения.Одним из мест, где это было бы особенно желательно, является передача длинных строковых литералов в функцию (например, предложение).

Ответы [ 3 ]

100 голосов
/ 05 октября 2010

Не кладите ничего между строк. Часть этапа лексирования в C ++ заключается в объединении смежных строковых литералов (даже через символы новой строки и комментарии) в один литерал.

#include <iostream>
#include <string>
main() {
  std::string my_val ="Hello world, this is an overly long string to have" 
    " on just one line";
  std::cout << "My Val is : " << my_val << std::endl;
}

Обратите внимание, что если вы хотите новую строку в литерале, вам придется добавить это самостоятельно:

#include <iostream>
#include <string>
main() {
  std::string my_val ="This string gets displayed over\n" 
    "two lines when sent to cout.";
  std::cout << "My Val is : " << my_val << std::endl;
}

Если вы хотите смешать целочисленную константу #define d с литералом, вам придется использовать несколько макросов:

#include <iostream>
using namespace std;

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

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

Существует некоторая странность в связи с тем, как работает оператор процессора stringify, поэтому вам нужно два уровня макроса, чтобы получить действительное значение TWO, которое будет преобразовано в строковый литерал.

9 голосов
/ 05 октября 2010

Они оба литералы?Разделение двух строковых литералов пробелом аналогично конкатенации: "abc" "123" совпадает с "abc123".Это относится как к прямой C, так и к C ++.

4 голосов
/ 05 октября 2010

Я не знаю, является ли это расширением в GCC или стандартным, но, похоже, вы можете продолжить строковый литерал, заканчивая строку обратной косой чертой (так же, как большинство типов строк могут быть расширены в этой усадьбе в C ++, например макрос, охватывающий несколько строк).

#include <iostream>
#include <string>

int main ()
{
    std::string str = "hello world\
    this seems to work";

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