8

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

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::string 中没有空终止符的字符。

我正在使用 VC++ 6.0。

4

4 回答 4

17

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

由于您要从 astring到 char 缓冲区,因此最简单的方法是使用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 );

而且,顺便说一句,您也许可以使用 a vector<char>,而不是 achar data[32]

编辑:

顺便说一句:VC6 是一个古老的编译器,它刚出来时很糟糕,在 C++ 标准被批准时很糟糕,并且完全不受 Microsoft 的支持。如果出了什么问题,他们甚至不会和你说话。你应该尽快离开VC6。

于 2011-12-01T17:32:17.897 回答
12

使用memcpy而不是strcpy,这就是它的用途:

memcpy(blocks[0].data, buffer.data(), sizeof(blocks[0].data)); 
于 2011-12-01T17:31:25.347 回答
1

使用strncpy()代替strcpy()

strncpy(blocks[0].data, buffer.c_str(), 32); 
于 2011-12-01T18:43:11.980 回答
-1

使用以下行之一

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).

顺便说一句,当字符串短于 32 个字符时,你会处理这种情况吗?你想追加一个空字节吗?

于 2011-12-01T17:38:37.637 回答