Разделение Строк C++ На Несколько Строк (Синтаксис Кода, А Не Синтаксический Анализ)
не путать с тем, как разбить строку разбора мудро, например:
разделить строку в 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::stringappend() метод, но мне было интересно, есть ли более короткие/более элегантные (например, более похожие на питона, хотя, очевидно, тройные кавычки и т. д. не поддерживается в c++) способ разбить строки в c++ на несколько строк для удобства чтения.
одно место, где это было бы особенно желательно, когда вы передаете длинные строковые литералы функции (например, приговор).
3 ответов:
не ставьте ничего между строк. Часть этапа лексики 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; }если вы хотите смешать a
#defineD целочисленная константа в литерал, вам придется использовать некоторые макросы:#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 processor работает, поэтому вам нужно два уровня макроса, чтобы получить фактическое значение
TWOв строковый литерал.
Они оба литералы? Разделение двух строковых литералов пробелами - это то же самое, что и конкатенация:
"abc" "123"Это то же самое, что"abc123". Это относится как к прямому C, так и к C++.
Я не знаю, является ли это расширением в GCC или стандартным, но, похоже, вы можете продолжить строковый литерал, закончив строку обратной косой чертой (так же, как большинство типов строк могут быть расширены в этом поместье в C++, например, макрос, охватывающий несколько строк).
#include <iostream> #include <string> int main () { std::string str = "hello world\ this seems to work"; std::cout << str; return 0; }
Comments