c++ - 用字节初始化 char* 和 std::string

标签 c++ arrays string c++17

以下是实现定义的:

char *cp = "\x96\xA0\xB4\xBE\xC8";

还有:

std::string = "\x96\xA0\xB4\xBE\xC8";

char 在我的编译器 (MSVC 2015) 上表示 signed char

我认为我不能执行以下操作:

unsigned char *cp = "\x96\xA0\xB4\xBE\xC8";

"\x96\xA0\xB4\xBE\xC8" 是 0 - 255 范围内的字节,因此我的问题是:

以上是否取决于编译器?

最佳答案

Is the following implementation-defined:

signed char *cp = "\x96\xA0\xB4\xBE\xC8";

and as well as:

std::string = "\x96\xA0\xB4\xBE\xC8";

在带 8 位宽签名的系统上 char , 是的。如果窄字符串文字中的十六进制转义序列落在为 char 定义的实现定义范围之外,则它具有实现定义的值。 .假设 8 位签名 char , 任何大于 7F 的十六进制值超出了可表示值的范围。

该文字是否用于初始化 std::string或指向字符的指针在这方面无关紧要。


您可以使用 unsigned char 的数组而不是字符串文字:

static constexpr unsigned char cp[] = {
    0x96,
    0xA0,
    0xB4,
    0xC8,
};

您可以使用此数组来初始化 std::basic_string<unsigned char>如果你需要它:

 std::basic_string<unsigned char> s = {std::begin(cp), std::end(cp)};

附言从字符串文字到非常量字符指针的转换格式错误(C++11 起;转换之前格式正确但已弃用)。

P.P.S char , unsigned charsigned char char 总是三种不同的类型是否签名。

关于c++ - 用字节初始化 char* 和 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56347861/

相关文章:

c++ - 三重嵌套 For 循环的时间复杂度,其中索引相互依赖

c++ - 测试 C 宏的值是否为空

python - 对不同维度的列表中的对进行排序

ios - 设置从数组中选择的按钮的标题 - Xcode iOS

c - C 中字符串的指针

java - 输出等于空

c++ - 来自两个以上字符串的最长公共(public)子字符串 - C++

c++ - 将事件写入事件查看器

python - 获取字符串中数值列表的最简洁方法

c++ - 为什么不能在头文件中单独写命名空间的层级?