C++ 通过Cin获得hex

C++ 通过Cin获得hex,c++,hex,C++,Hex,为什么这个代码不起作用 int x; cin >> x; 通过输入0x1a我得到x==0而不是26 为什么会这样?我认为要使用十六进制,您需要执行以下操作: cin >> hex >> x; cout << hex << x; cin>>hex>>x; cout您的代码应为: int x; cin >> hex >> x; 默认情况下,cin期望读入的任何数字都是十进制的。显然,0x1a不是有效的小数,因

为什么这个代码不起作用

int x;
cin >> x;
通过输入
0x1a
我得到
x==0
而不是
26


为什么会这样?

我认为要使用十六进制,您需要执行以下操作:

cin >> hex >> x;
cout << hex << x; 
cin>>hex>>x;
cout您的代码应为:

int x;
cin >> hex >> x;
默认情况下,
cin
期望读入的任何数字都是十进制的。显然,
0x1a
不是有效的小数,因此无法进行转换。要使其工作,我们必须使用流修饰符
hex
,它提示
cin
期望从十六进制而不是十进制转换数字

在这种情况下,
0x
前缀是可选的,因此输入的
10
将被读取并存储为十进制16。

在使用
std::cout/std::cin
时,可以这样想:

std::cout>x
表示将值放入
x

请注意操作符所指向的方向。这应该会给你一个提示,告诉你在使用这些函数时它们会做什么

结果得到0而不是26的原因是
std::cin
将解析输入中的所有非数字字符。毕竟,
x
是一个整数,它不会将
0x
识别为十六进制数的一部分。如果输入是
9x2
(结果将是
9
),它将具有相同的行为 使用名称空间std; int main() { 国际数据[16]; cout>hex>>数据[i]) 实际上,您可以强制
>
运算符获取并正确解释前缀
0
0x
。只需删除
std::cin
的默认设置:

std::cin.unsetf(std::ios::dec);
std::cin.unsetf(std::ios::hex);
std::cin.unsetf(std::ios::oct);

现在,当您输入0x1a时,您将收到26。

好吧,首先应该是
cin>>x
。如果我们还没有学会使用十六进制,可能是故意的错误?十六进制是std库的一部分。您可以阅读更多内容。它也可以与二进制一起工作吗?类似于
的内容您还需要重命名数据数组吗,否则该数组具有和操纵者的名字一样会导致trouble@11684不,不幸的是,没有
bin
选项。似乎应该有。你能向OP解释为什么吗?好的,但是人们如何要求
cin
读取十六进制呢?是否有一个标志,就像
cout
一样?除了使用
std以外,我知道没有其他方法::hex
操纵器,用于在流上设置基本字段格式标志。您可以使用
操纵器,或者认为这应该是可接受的答案。使用hex,如果您执行以下操作:cin>>hex>x;并输入17,您将得到23,这几乎总是不是您作为用户想要的。使用此方法,您可以得到任何用户想要的,前缀将包含在deration.23给出了23,0xa给出了0xa等等。它们都是很好的答案,这实际上取决于应用程序上下文来决定应该使用哪一种。Stroustrup在他的书中对这两种方法进行了讨论:两种方法都是有用的。都是向上投票的。问题向上投票的。每个人都有向上投票的机会!
std::cin.unset(std::ios::basefield);
std::cin.unsetf(std::ios::dec);
std::cin.unsetf(std::ios::hex);
std::cin.unsetf(std::ios::oct);