c++中字符的标准字符串行为
Standard string behaviour with characters in C++
我有一个问题我不明白。我将字符添加到标准字符串中。当我取出它们时,打印的值不是我所期望的。
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
,因此当0x89
和0x76
被char
代表时,它们就变成了负的。
你必须确保字符串有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
相关文章:
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 如何在 C++11 中将标准::字符串转换为标准::u32字符串?
- 从标准::字符串到标准::矢量<bool>的快速转换
- 使用标准库计算字符串中的十进制数
- 如何初始化一个标准::字符串数组?
- C++ - 转换标准::浮点数组的字符串
- 连接和压缩标准::vector<std::字符串的最佳方法>
- 在命名管道中发送标准::字符串流
- 标准::字符串与空字符可能吗?
- 如何从标准::string_view正确创建标准::字符串?
- 从常量字符*、字符*参数到标准::字符串的直接转换接口
- 热将标准::__cxx11::字符串转换为标准::字符串
- 如何将字符*浅复制到标准::字符串?
- 十进制到八进制递归C++.以标准::字符串格式输出
- 对于C字符串,是否有一个标准的C++迭代器
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 常量转发引用给出错误 C2440:"正在初始化":无法从"常量标准::字符串"转换为"常量标准::字符串 &&"
- 将来C++的标准库会包含网络、字符串算法,..吗?
- 分段错误标准::矢量<标准::字符串>
- 如何通过标准字符串打印 ostream 变量的值?