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

问题描述 投票:0回答:4

不要与如何明智地拆分字符串解析相混淆,例如:
在 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++ 中分成多行。

特别需要这样做的一个地方是当您将长字符串文字传递给函数(例如一个句子)时。

c++ string syntax coding-style readability
4个回答
153
投票

不要在琴弦之间放置任何东西。 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
的实际值,并将其制作为字符串文字。


11
投票

它们都是字面意思吗?用空格分隔两个字符串文字与连接相同:

"abc" "123"
"abc123"
相同。这适用于直接 C 和 C++。


8
投票

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

#include <iostream>
#include <string>

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

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

0
投票

我没有足够的代表来发表评论,但我认为有必要指出,在 meador 的回答中,“world”和“this”之间的额外空格是由“this”之前的缩进空格引起的。

© www.soinside.com 2019 - 2024. All rights reserved.