为什么std-cin只在与int变量一起使用时有效



过一段时间我将尝试使用std::cin。

使用uint8_tunsigned 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::decstd::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操纵器的效果在很大程度上取决于所涉及的变量的类型。

相关内容

最新更新