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

标签 c++ stdstring strcpy arrays

我正在使用仅包含 char[32] 的结构写入二进制文件。我基本上需要通过对字符串数组执行各种计算并连接结果来格式化每个数据 block 。我正在尝试将 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。

最佳答案

您不能使用 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++ 标准被批准时很糟糕,并且完全不受 Microsoft 的支持。如果出现问题,他们甚至不会与您交谈。你应该尽快离开 VC6。

关于C++ 将 std::string 复制到没有空终止的 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8345621/

相关文章:

c++ - 使用 std::string 时出现 bad_alloc 错误

c++ - 如何在每个元素中使用自定义字符串设置 std::vector<std::string>

c++ - 单个单词的快速填充 strcpy

将指针字符串复制到其他指针

c++ - opencv函数实现

c++ - fork进程之间的随机数是相同的

c++ - 在抛出 'std::out_of_range' what(): basic_string::erase 实例后终止调用

c - 内存中的 strcpy 和字符串表示

c++ - 纯虚函数覆盖

为多个体系结构编译时的 C++ 多个函数定义