我尝试使用std::cin一段时间后。
使用uint8_t
或unsigned char
:
unsigned char data;
std::cin >> std::dec >> data;
无论是否使用std::dec
,我都会得到我输入的第一个ASCII字符。如果我输入12
,数据是0x31
而不是12
。为什么它直到255
才能解析数字并存储在char
中?
int data;
std::cin >> std::dec >> data;
给出正确data=12/0xC
而非0x31
- 为什么?
将char[N]
与std::hex
配合使用
char data[128];
std::cin >> std::hex >> data;
还获取ASCII字符而不是十六进制。
- 写入
0x010203040506...
数据是0xFFFFFFFFF..
。 std::cin>>std::hex
不能自动将我输入的字符串解析为十六进制吗?
2条答案
按热度按时间bpzcxfmw1#
简而言之:
cin >> charVar
扫描stdin
中的单个字符cin >> intVar
扫描stdin
中的字符,直到输入非数字字符解释您的观察结果:
char
变量可以存储单个ASCII字符。键入
12
时,仅扫描字符1
。字符
1
的ASCII码为0x31
。bxgwgixi2#
std::dec
和std::hex
影响整数的格式。但是对于流媒体运营商来说,
char
及其变体(包括uint8_t
)不是整数,它们是单个字符,它们总是读取单个字符,并且从不解析整数。这就是这些函数的定义。没有别的办法。如果你想要一个范围有限的整数,首先读入一个
int
(或者其他不是char
变体的整数类型),然后再进行范围检查。如果你愿意,你可以在之后将它强制转换成一个小类型,但是你可能不应该这样做。char
类型在数字上很难处理。类似地,阅读
char
数组时读取的是字符串。(另外,如果不使用setw()
来限制长度以适应现有缓冲区,则永远不要这样做。更好的是,使用std::string
。)这就是它的定义。