c++复制std::string到char数组,不带null终止
C++ copy std::string to char array with no null termination
我正在使用一个只包含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个字符时,你会处理这种情况吗?那么您要追加一个空字节吗?
相关文章:
- 使用不带参数的函数访问结构元素
- 不带大括号的枚举形式
- 将静态库链接到不带-fPIC的共享库中
- 检查不带转换的扫描格式
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 不带预处理器的调用方法/文件的文件名/行号
- 如何打印不带空格的输入整数?
- 带<T>或不带 (C++) 的类模板
- 声明C++数组(带或不带 "new" 关键字)
- 不带轮询的 SDL2 事件回调
- 多个'if'语句,不带'else'
- 使用不带缓冲区变量的冲刺
- "extern"声明以及带有和不带参数列表的类模板实例的后续定义
- 打印标准::<char>不带无关字符的矢量
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 调用多个类而不带 if 语句
- 在 c++ 中,rand() 在执行有调试和不带调试的程序时生成不同的结果
- 删除动态数组上不带方括号的内容
- 定义不带大小或零大小的数组
- c++复制std::string到char数组,不带null终止