我使用只包含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());
然后我再次使用null终止符。我只想复制std :: string中没有空终止符的字符。
我使用的是VC ++ 6.0。
答案 0 :(得分:16)
您不能使用strcpy
,因为它会查找NULL终止符以标识字符串的结尾,并将NULL复制到输出字符串。
由于您从string
转到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 );
顺便说一下,您可以使用vector<char>
,而不是char data[32]
编辑:
暂且不说:VC6是一个古老的编译器,它在出现时很糟糕,在批准C ++标准时很糟糕,并且完全没有得到微软的支持。如果出现问题,他们甚至不会和你说话。你应该尽快离开VC6。
答案 1 :(得分:11)
使用memcpy
代替strcpy
,这就是它的用途:
memcpy(blocks[0].data, buffer.data(), sizeof(blocks[0].data));
答案 2 :(得分:1)
使用strncpy()
代替strcpy()
:
strncpy(blocks[0].data, buffer.c_str(), 32);
答案 3 :(得分:-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).
BTW,当字符串短于32个字符时,你是否处理这种情况?你想附加一个空字节吗?