C++将std :: string复制到char数组,没有空终止

Geo*_*Ego 7 c++ arrays stdstring strcpy

我正在使用只包含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());
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,因为使用c_str()添加空终止符使字符串长度为33.如果我从字符串中减去一个字符,它可以工作,但后来我有空终结符,我不想要.我可以成功地做到以下几点:

strcpy(blocks[0].data, "12345678123456781234567812345678");
Run Code Online (Sandbox Code Playgroud)

但我想先构造字符串,因为它通常涉及连接各种数组的不同字符串.例如,我可以用std :: string来做到这一点:

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

但后来我再次使用null终止符.我只想复制std :: string中的字符而没有空终止符.

我使用的是VC++ 6.0.

Joh*_*ing 16

您无法使用,strcpy因为它查找NULL终止符以标识字符串的结尾,并将NULL复制到输出字符串.

因为你要从一个stringchar缓冲区,最简单的方法是使用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 );
Run Code Online (Sandbox Code Playgroud)

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

编辑:

抛开:VC6是一个古老的编译器,它出来时很糟糕,当C++标准被批准时很糟糕,并且完全没有得到微软的支持.如果出现问题,他们甚至不会跟你说话.你应该尽快离开VC6.


Jon*_*Jon 11

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

memcpy(blocks[0].data, buffer.data(), sizeof(blocks[0].data)); 
Run Code Online (Sandbox Code Playgroud)

  • 在C++中使用`std :: copy`并没有错 (6认同)
  • @ AlfP.Steinbach:当然.我选择了`memcpy`,因为它最接近OP已经拥有的东西,并且他们会习惯使用它.我想,对于`std :: copy`版本,如果它是你第一次遇到它,就不能说了. (2认同)