如何在C++字符串中添加换行?

7
我在思考是否可以在C++中创建一个包含数据的字符串,而不是创建一个字符串数组或者字符串集合。
假设我有一个名为mv的字符串:
mv =  
"hello         
 new                   
 world "

"hello"、"new"和"world"位于不同的行中。如果我们打印mv,那么"hello"、"new"和"world"应该分别出现在不同的行中。

我也在考虑竞赛编程方面的问题。如果我将所有查询的答案连接成一个字符串,然后输出答案,或者逐个cout所有的查询,这两种输出方式会有时间差异吗?


除非我错了,你可以在字符串中使用换行符“\n”。 - user4081625
我试图连接 '\n' 但它打印出了 '\n'。 - Mrinal Verma
1
展示一下这个“不起作用”的连接代码。 - Jacek Cz
3个回答

13
我希望我的字符串变量能够以这种格式存储信息,因此像我的字符串变量mv应该在第一行和第二行都有一些字符串,并且整个字符串应该像单个字符串一样工作。
C++中的字符串(std :: string )是什么?
它是一个动态可调整大小的字符数组容器,配备有操作该数组的方法。
字符数组是:
characters: |c0|c1|c2|c3|...|cN|

那是std::string的本质。你对此无能为力。

什么是“行”(的文本)?

C++或任何其他编程语言中均没有“行”的正式定义。“行”是属于阅读和写作在二维空间中排列的文本的视觉概念。一行位于另一行的垂直上方或下方。

计算机不会在二维空间中排列数据。它们将其全部排列在线性、一维存储中。没有数据位于垂直上方或下方。

但是,编程语言可以表示文本行,并且它们都按照相同的约定进行。通常,一行是以新行序列结束的字符数组。

新行序列本身就是一个数组,由一个或两个字符组成,具体取决于操作系统的约定。Windows使用包含两个字符的序列回车符、换行符。类Unix操作系统使用包含一个字符的序列换行符。您可以在Wikipedia: Newline 上学习这个主题。但是,为了可移植性,在C++源代码中,无论实际上是什么,换行符序列都用转义序列\n表示,您可以在源代码中使用它作为字符。

因此,字符数组:

    |h|e|l|l|o|\n|

代表了文字行:

hello

在C++中,字符数组:

    |h|e|l|l|o|\n|n|e|w|\n|w|o|r|l|d|\n|

表示三行文本:

hello
new
world

如果您想将该数组存储到单个 std::string 中,C++使您可以这样做:

std::string s0{'h','e','l','l','o','\n','n','e','w','\n','w','o','r','l','d','\n'};
更方便的方式如下:
std::string s1{"hello\nnew\nworld\n"};

如果你对使用转义序列\n感到恐惧,甚至可以像这样:

或者 - 如果您对使用转义序列\n感到害怕 - 可以像这样:

std::string s2
{R"(hello
new
world
)"};

这些将三行文本存储为字符串的方式都会在该字符串中创建完全相同的字符数组,即:

    |h|e|l|l|o|\n|n|e|w|\n|w|o|r|l|d|\n|

它们都创建了完全相同的std::string

如果您打印这些字符串中的任何一个,您将看到相同的内容,例如:

#include <string>
#include <iostream>

int main() {
    std::string s0{'h','e','l','l','o','\n','n','e','w','\n','w','o','r','l','d','\n'};
    std::string s1{"hello\nnew\nworld\n"};
    std::string s2 // Yes...
{R"(hello
new
world
)"}; // ...it is meant to be formatted like this
    std::cout << "--------------" << std::endl;
    std::cout << s0;
    std::cout << "--------------" << std::endl;
    std::cout << s1;
    std::cout << "--------------" << std::endl;
    std::cout << s2;
    std::cout << "--------------" << std::endl;
    return 0;
}

输出:

--------------
hello
new
world
--------------
hello
new
world
--------------
hello
new
world
--------------

实时演示


5
如果我没有误解你的问题,这里是你的答案,在每行末尾添加转义字符。
字符串 mv = "hello\n\ new\n\ world\n";
\n -> 换行符 \ -> 转义字符
以下是工作示例: 示例 string mv = "hello\n\ new\n\ world\n";

1
你可以在字符串中添加 \n 字符来创建新的一行。
cout << "Hello \n New \n World" << endl;

这将输出:

Hello 
New 
World

1
我想让我的 字符串变量 以这种格式存储信息,因此我的字符串变量 mv 应该在第一行中有一些字符串,在第二行中有一些字符串,并且整个字符串应该像单个字符串一样工作。 - Mrinal Verma
@MrinalVerma 似乎您误解了基本的C++概念,"string holding string"是什么意思? - Jacek Cz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接