结合std :: string和std :: vector <char> </char>

时间:2010-12-30 12:03:16

标签: c++ string stl vector

这不是实际的代码,但这代表了我的问题。

std::string str1 = "head";
char *buffer = "body\0body"; // Original code has nullbytes;
std::string str2 = "foot";
std::vector<char> mainStr(buffer, buffer + strlen(buffer));

我想将str1str2放入mainStr订单:

  

headbody \ 0bodyfoot

因此维护二进制数据。这有可能吗?

PS :感谢您告诉strlen部分错误。我只是用它来表示buffer的长度。 :)

7 个答案:

答案 0 :(得分:3)

应该有一些方法来定义“缓冲区”中的数据长度。 通常字符0用于此,大多数标准文本函数都假定这一点。因此,如果您将字符0用于其他目的,则必须提供另一种方法来查找数据长度。

仅举例:

char buffer[]="body\0body";
std::vector<char> mainStr(buffer,buffer+sizeof(buffer)/sizeof(buffer[0]));

这里我们使用数组,因为它提供了指针 - 存储数据大小的更多信息。

答案 1 :(得分:2)

您不能使用strlen,因为它使用'\ 0'来确定字符串的结尾。但是,以下内容将满足您的需求:

std::string head = "header";
std::string foot = "footer";
const char body[] = "body\0body";

std::vector<char> v;
v.assign(head.begin(), head.end());
std::copy(body, body + sizeof(body)/sizeof(body[0]) - 1, std::back_inserter<std::vector<char> >(v));
std::copy(foot.begin(), foot.end(), std::back_inserter<std::vector<char> >(v));

因为字符缓冲区在字符串的末尾添加了一个NUL字符,所以你要忽略它(因此从最后一个迭代器得到-1)。

答案 2 :(得分:1)

您可以使用std::vector<char>::insert将所需数据附加到mainStr

这样的事情:

std::string str1 = "head";
char buffer[] = "body\0body"; // Original code has nullbytes;
std::string str2 = "foot";

std::vector<char> mainStr(str1.begin(), str1.end());
mainStr.insert(mainStr.end(), buffer, buffer + sizeof(buffer)/sizeof(buffer[0]));
mainStr.insert(mainStr.end(), str2.begin(), str2.end());

免责声明:我没有编译它。

答案 3 :(得分:1)

顺便说一句。如果你的字符串中有空字节,strlen将无效!

要插入到矢量中的代码是:

前:

mainStr.insert(mainStr.begin(), str1.begin(), str1.end());

回:

mainStr.insert(mainStr.end(), str2.begin(), str2.end());

使用上面的代码(使用strlen将打印)

headbodyfoot

编辑:刚刚将copy更改为insertcopy要求我认为空间可用。

答案 4 :(得分:1)

您可以使用IO流。

std::string str1 = "head";
const char *buffer = "body\0body"; // Original code has nullbytes;
std::string str2 = "foot";
std::stringstream ss;
ss.write(str1.c_str(), str1.length())
  .write(buffer, 9) // insert real length here
  .write(str2.c_str(), str2.length());
std::string result = ss.str();

std::vector<char> vec(result.c_str(), result.c_str() + result.length());

答案 5 :(得分:0)

str1和str2是写入文本的字符串对象。

我希望编译器在语句上失败,比如缓冲区的声明,我不在乎它破坏了多少遗留代码。如果你还在构建它,你仍然可以修复它并放入const。

您需要更改向量声明,因为strlen将停在第一个空字符处。如果你做了

char buffer[] = "body\0body";

然后sizeof(缓冲区)实际上会让你接近你想要的,尽管你也会得到结束的空终结符。

一旦你的矢量mainStr设置正确,你可以这样做:

std::string strConcat;
strConcat.reserve( str1.size() + str2.size() + mainStr.size() );
strConcat.assign(str1);
strConcat.append(mainStr.begin(), mainStr.end());
strConcat.append(str2);

如果使用buffer,buffer + sizeof(buffer)-1

设置了vector

答案 6 :(得分:0)

 mainStr.resize(str1.length() + str2.length() + strlen(buffer));  
 memcpy(&mainStr[0], &str1[0], str1.length());  
 memcpy(&mainStr[str1.length()], buffer, strlen(buffer));  
 memcpy(&mainStr[str1.length()+strlen(buffer)], &str2[0], str2.length());