如何构造带有嵌入式null的std :: string?
如果我想用这样的行构造一个std :: string:
std::string my_string("astd::string my_string("astd::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("pqCComBSTR(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 <char>的Doug T的答案。
另请参阅RiaD以获取C ++ 14解决方案。
我知道这个问题已经问了很长时间了。但是对于遇到类似问题的任何人,可能对以下代码感兴趣。
##代码##
