【发布时间】:2016-01-19 13:57:10
【问题描述】:
我正在使用 unsigned char*s 包含字符串的过时代码库。对于我的功能,我使用了strings,但是有一个问题:
我不能在旧代码的#include <cstring> 中使用任何东西。从string 复制到unsigned char* 是一个费力的过程:
unsigned char foo[12];
string bar{"Lorem Ipsum"};
transform(bar.cbegin(), bar.cbegin() + min(sizeof(foo) / sizeof(foo[0]), bar.size()), foo, [](auto i){return static_cast<unsigned char>(i);});
foo[sizeof(foo) / sizeof(foo[0]) - 1] = '\0';
如果我这样做,我是否会遇到未定义的行为或别名问题:
strncpy(reinterpret_cast<char*>(foo), bar.c_str(), sizeof(foo) / sizeof(foo[0]) - 1);
foo[sizeof(foo) / sizeof(foo[0]) - 1] = '\0';
【问题讨论】:
-
这里需要跨平台吗?您是否愿意满足于在您当前平台上工作的东西,即使它可能严格是 C++ 标准中的 UB?
char保证与signed char或unsigned char之一具有相同的表示形式,即使在signed的情况下,您也可能使用严格的ACSII 数据是安全的:[0,127]。 -
@BeyelerStudios 是 ASCII。
-
@BeyelerStudios
strncpy已经帮我检查过了。 -
措辞注意事项:您不能在
char*s 中存储任何风格的字符串。您将字符串存储在chararrays 中,并通过指针访问这些数组的内容,即char*s。混淆“数组”和“指针”会导致混乱。 -
@PeteBecker,这对我来说太过分了。这也不正确 - 我当然可以将字符串存储在
char*中,而这从来都不是数组
标签: c++ c-strings strcpy reinterpret-cast unsigned-char