【问题标题】:Getting hex through Cin通过 Cin 获取十六进制
【发布时间】:2021-12-26 10:27:33
【问题描述】:

为什么这段代码不起作用?

int x;
cin >> x;

输入0x1a 我得到x == 0 而不是26

为什么?

【问题讨论】:

  • 嗯,首先应该是cin >> x...

标签: c++ hex


【解决方案1】:

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

cin >> hex >> x;
cout << hex << x; 

你也可以用 dec 和 oct 等替换 hex。

【讨论】:

  • 如果我们还没有学会使用十六进制,也许错误是故意的?
  • hex 是标准库的一部分。你可以阅读更多here
  • 它是否也适用于二进制文件? cout &lt;&lt; bin &lt;&lt; myInt; 之类的东西?
  • 你还需要重命名你的数据数组,否则数组和机械手同名会出问题
  • 在那之后不要忘记重置您的流。例如cin &gt;&gt; hex &gt;&gt; x &gt;&gt; dec;
【解决方案2】:

实际上,您可以强制 &gt;&gt; 运算符获取并正确解释前缀 00x。您所要做的就是删除std::cin 的默认设置:

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

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

【讨论】:

  • 我认为这应该是公认的答案。如果您执行以下操作,则使用十六进制: cin >> hex > x;并输入 17 你会得到 23 这几乎总是不是你想要的用户。使用这种方法,您可以获得任何用户想要的东西,前缀被考虑在内。 23 给出 23,0xa 给出 0xa 等等。
  • 它们都是很好的答案,并且它确实取决于应用程序上下文来确定您应该使用哪个。 Stroustrup 在他的书中对这两种方法都进行了介绍:这两种方法都很有用。两人都投了赞成票。问题赞成。每个人都会获得支持!
  • std::cin.unsetf(std::ios::basefield);
【解决方案3】:

在使用std::cout/std::cin 时想想&lt;&lt;&gt;&gt;,如下所示:

std::cout &lt;&lt; x 表示从x获取值

std::cin &gt;&gt; x 表示将值放入 x

注意操作员所指的方向。这应该会提示您在使用这些函数时它们会做什么。

结果是 0 而不是 26 的原因是 std::cin 将解析输入中的所有非数字字符。毕竟,x 是一个整数,它不会将0x 识别为十六进制数的一部分。如果输入是9x2(结果只是9),它的行为也会相同。

【讨论】:

    【解决方案4】:

    您的代码应为:

    int x;
    cin >> hex >> x;
    

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

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

    【讨论】:

    • 你能向 OP 解释为什么吗?
    • 好的,但是如何让cin 改为读取十六进制呢?有没有像cout那样的标志?
    • 除了使用std::hex 操纵器在流上设置基域格式标志之外,我没有其他办法。您可以在流上使用operator&lt;&lt;setf 来执行此操作。默认情况下,当创建cin 时,它设置为std::decstd::cout 也一样
    【解决方案5】:
    #include<iostream>
    using namespace std;
    
    int main()
    {
        int data[16];
        cout << "enter the 16 hexadecimal numbers\n";
        for(int i = 0;i < 16;i++)
        {
            if(cin >> hex >> data[i])
                cout << "input worked\n";
            else{
                cin.clear();
                cout << "invalid input\n";
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-29
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2015-08-01
      • 2012-11-04
      • 2020-02-12
      • 1970-01-01
      相关资源
      最近更新 更多