c++ - 0x00 和 char 数组

标签 c++ char

为什么 char 数组在检测到 0x00 字节之前就停止,如何避免这个问题(也许通过使用另一种数据类型(哪种数据类型以及为什么)或使用 char 的“技巧”)?

例如在下面的代码中,输出的只是“a”,其他字节不显示:

unsigned char cbuffer[]={0x61,0x00,0x62,0x63,0x0};
std::string sbuffer=reinterpret_cast<const char*>(cbuffer);

cout << sbuffer << endl;

类似下面的代码,输出的是“ab”:

unsigned char cbuffer[]={0x61,0x62,0x00,0x63,0x0};
std::string sbuffer=reinterpret_cast<const char*>(cbuffer);

对于该问题(其中 0x00 作为普通字节保存在数组中)的直接有效的解决方法将不胜感激。

最佳答案

在 C 语言中,将字符串作为指向空终止 char 数组的指针进行传递是很常见的。 null 由 0x00 表示。为了简化转换,std::string 可从指向空终止字符数组的指针构造,这就是您的代码所发生的情况。但是当它找到 null 时,它认为这是字符串的结尾。如果你直接 cout 一个 char 数组,你会发现它做了同样的假设,因为它们没有其他方法来确定 char* 指向的字符串的结尾>。 (如果他们理解 char (&)[],理论上他们可以说出你的情况的长度,但遗憾的是标准库中几乎没有任何东西可以做到)。

预期的解决方法是改用此构造函数:

int len = sizeof(cbuffer)/sizeof(cbuffer[0]);
std::string sbuffer(cbuffer, len); //5 characters in cbuffer, 1 byte each

int len = sizeof(cbuffer)/sizeof(cbuffer[0]);
std::cout.write(cbuffer, len); //5 characters in buffer, 1 byte each

但是,您必须小心使用sizeof(cbuffer)。如果 cbufferchar*(指针)而不是 char(&)[](数组),则 sizeof(ptr ) 将返回错误的值,并且如果字符串不是以 null 结尾的,则此时无法获得正确的长度。

关于c++ - 0x00 和 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8510239/

相关文章:

c - 如何在不使用ascii码的情况下在C中的字符和数字之间进行算术运算

java - 在 java 中将 int 转换为 char - 我必须使用 ASCII 吗?

c++ - 不确定为什么我在使用字符串或字符时会得到不同的长度

JAVA字符输入

c++ - google mock - 保存 EXPECT_CALL 然后重新使用和更改子句

c++ - 无法访问 ATL/COM C++ Outlook 插件中的邮件项目

c++ - 为什么我的控制台应用程序不等待第 37 和 38 行?

c++ - 为什么不能使用 initializer_list 来初始化 unique_ptr 的 vector ?

c++ - 使用 GetOpenFileName() 限制目录

c# - 为什么值为 128 的字符是空字符串而不是欧元符号 €