过一段时间我将尝试使用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
不能自动将我键入的字符串解析为十六进制吗?
简而言之:
cin >> charVar
扫描stdin
中的单个字符cin >> intVar
扫描stdin
中的字符,直到输入非数字字符
解释您的观察结果:
char
变量可以存储单个ASCII字符。
键入12
时,只扫描字符1
。
字符1
的ASCII码是0x31
。
std::dec
和std::hex
影响整数的格式。
但就流媒体运营商而言,char
及其变体(包括uint8_t
(不是整数,它们是单个字符。它们总是读取单个字符,而从不解析整数。
这些函数就是这样定义的。没有办法。如果你想要一个范围有限的整数,首先读取int
(或其他不是char
变体的整数类型(,然后进行范围检查。如果你愿意,你可以在之后把它转换成一个小类型,但你可能不应该。char
类型在数字上很难处理。
类似地,读取char
的数组将读取字符串。(另外,如果不使用setw()
来限制缓冲区的长度,请不要这样做。最好使用std::string
。(这就是它的定义。
如果想在使用std::cin
获取输入时看到像std::hex
这样的操纵器的效果,可以尝试使用如下的整数变量
int test_hex;
std::cin >> std::hex >> test_hex;
如果输入0x12
作为输入,则整数值18
被存储在整数变量test_hex
中。我们可以看到std::hex
已经在输入上下文中发挥了作用。
另一方面,如果在以下情况下输入0x12
,则字符串"0x12"
被写入字符阵列data
。注意:Sebastian Redl关于输入大小不超过字符数组大小以及使用std::string
的观点应该牢记在心。
char data[128];
std::cin >> std::hex >> data;
因此,I/O操纵器的效果在很大程度上取决于所涉及的变量的类型。