c++复制std::string到char数组,不带null终止

C++ copy std::string to char array with no null termination

本文关键字:不带 null 终止 数组 复制 std string c++ char      更新时间:2023-10-16

我正在使用一个只包含char[32]的结构体写入二进制文件。我基本上需要通过对字符串数组执行各种计算并连接结果来格式化每个数据块。我试图将std::字符串复制到没有null终止的字符数组。我读得越多,就越困惑。如果我这样做:

struct block{
    char data[32];
};
block blocks[2048];
std::string buffer;
buffer = "12345678123456781234567812345678";
strcpy(blocks[0].data, buffer.c_str());

我得到一个错误,因为用c_str()添加空终止符使字符串长度为33。如果我从字符串中减去一个字符,它可以工作,但我有一个空终止符,这是我不想要的。我可以成功地执行以下操作:

strcpy(blocks[0].data, "12345678123456781234567812345678");

,但我想先构造字符串,因为它经常涉及连接来自不同数组的不同字符串。例如,我可以使用std::string:

std::string buffer = stringArray1[0] + stringArray2[0];
strcpy(blocks[0].data, buffer.c_str());

但是我又有了空终止符。我只是想准确地复制std::字符串中的字符,没有空终止符。

我用的是vc++ 6.0

您不能使用strcpy,因为它查找NULL终止符来识别字符串的结尾,并将NULL复制到输出字符串。

因为你要从string到字符缓冲区,最简单的事情是使用std::copy:

#include <algorithm>
static const size_t data_size = 32;
struct block{
    char data[data_size];
};
/* ... */
std::string buffer = stringArray1[0] + stringArray2[0];
std::copy( buffer.begin(), buffer.end(), blocks[0].data );

顺便说一下,您可能可以使用vector<char>,而不是char data[32]

编辑:

题外话:VC6是一个古老的编译器,当它出来的时候很糟糕,当c++标准被批准的时候很糟糕,并且完全不被微软支持。如果出了什么问题,他们甚至不会和你说话。你应该尽快退出VC6。

使用memcpy代替strcpy,这就是它的作用:

memcpy(blocks[0].data, buffer.data(), sizeof(blocks[0].data)); 

使用strncpy()代替strcpy():

strncpy(blocks[0].data, buffer.c_str(), 32); 

使用下面的一行

memcpy(blocks[0].data, buffer.c_str(), buffer.size());
memcpy(blocks[0].data, buffer.c_str(), 32);
memcpy(blocks[0].data, buffer.c_str(), buffer.size() > 32 ? 32 : buffer.size());
std::copy(buffer.begin(), buffer.end(), blocks[0].data).

BTW,当字符串短于32个字符时,你会处理这种情况吗?那么您要追加一个空字节吗?