c++中字符的标准字符串行为

Standard string behaviour with characters in C++

本文关键字:字符串 标准 字符 c++      更新时间:2023-10-16

我有一个问题我不明白。我将字符添加到标准字符串中。当我取出它们时,打印的值不是我所期望的。

int main (int argc, char *argv[])
{
    string x;
    unsigned char y = 0x89, z = 0x76;
    x += y;
    x += z;
    cout << hex << (int) x[0] << " " <<(int) x[1]<< endl;
}

输出:ffffff89 76

我所期望的:89 76

你知道这里发生了什么吗?我该如何修复它?

字符串运算符[]生成char,即有符号值。当您将其转换为int作为输出时,它也将是一个带符号的值。

转换为char的输入值是负的,因此int也将是负的。因此,您将看到前面描述的输出。

在你的平台上,char很可能是signed,因此当0x890x76char代表时,它们就变成了负的。

你必须确保字符串有unsigned char作为value_type,所以这应该工作:

typedef basic_string<unsigned char> ustring; //string of unsigned char!
ustring ux;
ux += y;
ux += z;
cout << hex << (int) ux[0] << " " <<(int) ux[1]<< endl;

打印你认为应该打印的内容:

89 76

在线演示:http://www.ideone.com/HLvcv

您必须考虑到char可能被签名的事实。如果直接将其提升为int,则保留带符号的值。相反,您首先必须将其转换为相同宽度的无符号类型(即unsigned char)以获得所需的值,然后然后将该值提升为整数类型以获得正确的格式化打印。

把它们放在一起,你想要这样的东西:

std::cout << (int)(unsigned char)(x[0]);

或者,使用c++风格强制转换:

std::cout << static_cast<int>(static_cast<unsigned char>(x[0]))

数字0x89为十进制137。它超过了the cap of 127,现在是一个负数,因此你在这里看到了ffffff。您可以简单地使用insert (unsigned char) after the (int) cast。您将得到所需的结果。

-Sandip