如何构造带有嵌入式null的std :: string?

时间:2020-03-06 15:02:45  来源:igfitidea点击:

如果我想用这样的行构造一个std :: string:

std::string my_string("a
std::string my_string("a
std::string s("aab");
s.at(1) = '
std::string s;
s.push_back('a');
s.push_back('
std::vector<char>
'); s.push_back('b');
';
b", 3);
b");

我想在结果字符串中包含三个字符(a,null,b)时,我只能得到一个。正确的语法是什么?

解决方案

我不知道我们为什么要这样做,但是请尝试以下操作:

std::vector<char> vec(100)
strncpy(&vec[0], "blah blah blah", 100);
std::string vecAsStr( vec.begin(), vec.end());

std :: strings的几乎所有实现都以null终止,因此我们可能不应该这样做。注意,由于自动空终止符(a,null,b,null)," a \ 0b"实际上有四个字符长。如果我们确实想这样做并破坏std :: string的合同,则可以执行以下操作:

printf("%s" &vec[0])
vec[10] = '
#include <iostream>
#include <string>

int main()
{
    using namespace std::string_literals;

    std::string s = "pl-
std::string   x("pq
CComBSTR(20,"mystring1##代码##mystring2##代码##")
rs"); // Two characters because input assumed to be C-String std::string x("pq##代码##rs",5); // 5 Characters as the input is now a char array with 5 characters.
-op"s; // <- Notice the "s" at the end // This is a std::string literal not // a C-String literal. std::cout << s << "\n"; }
'; vec[11] = 'b';

但是,如果我们这样做了,所有的朋友都会嘲笑我们,我们将永远找不到真正的幸福。

以下将起作用...

##代码##

如果我们要像使用c样式字符串(字符数组)那样进行操作,请考虑使用

##代码##

我们拥有更多的自由,可以像对待c字符串一样将其像数组一样对待。我们可以使用copy()复制到字符串中:

##代码##

我们可以在许多可以使用c弦的地方使用它

##代码##

但是,自然地,我们会遇到与C弦相同的问题。我们可能会忘记空终端或者超出分配的空间写。

如果此问题不仅是出于教育目的,最好使用std :: vector <char>。

从C ++ 14开始

我们已经能够创建文字std :: string

##代码##

在C ++ 14之前

问题是带有一个const char *的std :: string构造函数假定输入是C字符串。 C字符串以" \ 0"终止,因此在到达" \ 0"字符时停止解析。

为了弥补这一点,我们需要使用从char数组(而非C-String)构建字符串的构造函数。这需要两个参数,一个指向数组的指针和一个长度:

##代码##

注意:C ++std :: string不是\ 0终止的(如其他文章所建议)。但是,我们可以使用c_str()方法提取一个指向包含C-String的内部缓冲区的指针。

还要查看下面关于使用vector &lt;char>的Doug T的答案。

另请参阅RiaD以获取C ++ 14解决方案。

我知道这个问题已经问了很长时间了。但是对于遇到类似问题的任何人,可能对以下代码感兴趣。

##代码##