将C ++字符串拆分为多行(代码语法,不解析)


77

不要与如何分割明智的字符串混淆,例如:
在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 ++中的字符串分成多行可读性。

一个特别理想的地方是将长字符串文字传递给函数(例如句子)时。


2
这是一个有趣的花絮:C ++词法分析器实际上并不关心在字符串中前后有多少个引号,只有两个例外。您使用的引号数量必须是奇数,并且必须在两侧都匹配。""""" This is a valid string and will be parsed """""。但是,这些字符串没有特殊的属性,它们的行为就像单引号一样。
Thomas Anthony 2012年

有趣的是,感谢您分享...有什么用处吗?您可能可以将其用作代码中不同字符串组的微妙标记,以通过perl / bash / python脚本进行外部解析。这就是我现在能想到的。:)
Jason R. Mick

@ThomasAnthony发生这种情况是因为它将尾部的引号视为一堆空字符串并将它们连接在一起-这不是功能,这是标准的C / C ++行为
texasflood 2015年

Answers:


125

不要在弦之间放任何东西。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;
}

如果要将#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处理器运算符的工作方式,其中存在一些怪异之处,因此您需要两个级别的宏才能将要生成的实际值TWO转换为字符串文字。


您可以混入int常量等其他项目吗?如果没有,如何添加这些?
杰森·米克

@Jason:混合int常量是什么意思?

my_function(arg_1,arg_2,“您好,此字符串为”两行“!
杰森·米克

4
组合字符串文字是词法阶段的实际部分(不是预处理程序),因为像这样的字符串拆分被定义为语言的一部分。
马丁·约克

1
@Jason,从您的后续问题看来,您需要的是STRINGIFY上面的宏。

10

他们都是文字吗?用空格分隔两个字符串文字与串联相同:"abc" "123"与相同"abc123"。这适用于直接C以及C ++。


6

我不知道它是GCC的扩展还是标准扩展,但看来您可以通过以反斜杠结束行来继续字符串文字(就像大多数类型的行都可以在C ++中的该扩展名中一样),例如,跨越多行的宏)。

#include <iostream>
#include <string>

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

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

4
该文字语法在world和之间包含大量空格this
SingleNegationElimination

@TokenMacGuy:的确如此,我没有注意到。如果将第二行(及后续行)一直向左移动,就很容易修复。但这确实会影响您缩进的外观。
rmeador

是的,这是我最初的方法,但是由于缩进/间距问题@SingleNegationElimination概述,我放弃了它。值得一提的是。
Jason R. Mick
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.