【问题标题】:Splitting C++ Strings Onto Multiple Lines (Code Syntax, Not Parsing)将 C++ 字符串拆分为多行(代码语法,不解析)
【发布时间】:2011-04-21 00:35:09
【问题描述】:

不要与如何拆分字符串解析相混淆,例如:
Split a string in 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++ 词法分析器实际上并不关心您在字符串前后放置了多少引号,只有两个例外。您使用的引号数量必须是奇数,并且它们必须在任一侧匹配。 """"" This is a valid string and will be parsed """""。但是,这些字符串没有特殊的属性,它们的行为就像单引号。
  • 有趣的感谢分享...有什么有用的目的吗?您可能可以将其用作代码中不同字符串组的微妙标记,以供 perl/bash/python 脚本进行外部解析。这就是我现在能想到的。 :)
  • @ThomasAnthony 发生这种情况是因为它将结尾的引号视为一堆空字符串并将它们连接在一起 - 这不是一个功能,而是标准的 C/C++ 行为

标签: c++ string syntax coding-style readability


【解决方案1】:

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

#include <iostream>
#include <string>

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

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

【讨论】:

  • 该字面语法在worldthis 之间包含很多空格
  • @TokenMacGuy:确实如此,我没有注意到。如果您将第二行(和后续行)一直移到左侧,则很容易修复。但这真的会影响缩进的外观。
  • 是的,这是我最初的方法,但由于@SingleNegationElimination 轮廓的缩进/间距问题,我放弃了它。不过要注意。
【解决方案2】:

不要在字符串之间放任何东西。 C++ 词法分析阶段的一部分是将相邻的字符串文字(甚至在换行符和 cmets 上)组合成一个文字。

#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, "hello world 这个字符串是" 两行");
  • 组合字符串文字实际上是词法阶段(不是预处理器)的一部分,因为像这样的字符串拆分被定义为语言的一部分。
  • @Jason,从您的后续问题来看,您似乎需要类似上面的 STRINGIFY 宏。
【解决方案3】:

它们都是文字吗?用空格分隔两个字符串文字与连接相同:"abc" "123""abc123" 相同。这适用于纯 C 和 C++。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2018-09-20
    • 2017-02-07
    相关资源
    最近更新 更多