如何构造带有嵌入式null的std :: string?
如果我想用这样的行构造一个std :: string:
std::string my_string("astd::string my_string("ab");std::string s("aab"); s.at(1) = 'b", 3);std::string s; s.push_back('a'); s.push_back('';std::vector<char>'); s.push_back('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-'; vec[11] = 'b';std::string x("pq-op"s; // <- Notice the "s" at the end // This is a std::string literal not // a C-String literal. std::cout << s << "\n"; }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.
但是,如果我们这样做了,所有的朋友都会嘲笑我们,我们将永远找不到真正的幸福。
以下将起作用...
##代码##如果我们要像使用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解决方案。
我知道这个问题已经问了很长时间了。但是对于遇到类似问题的任何人,可能对以下代码感兴趣。
##代码##