【问题标题】:How to validate hex input with std::cin?如何使用 std::cin 验证十六进制输入?
【发布时间】:2011-03-18 03:05:20
【问题描述】:

我按照http://www.parashift.com/c++-faq-lite/input-output.html中的方法做了如下验证,但是还是不行:

if (!(cin >> hex >>address1))
    {
        cout << "Invalid input.";               
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }   

它一直将剩余的输入携带到下一个输入,从而使下一个输入不能被用户输入,即使 std::cin 被清除和忽略。

【问题讨论】:

  • “剩余输入”是什么意思?它应该会占用所有内容,直到您按 Enter 或字符串中有空格。
  • 表示我在上面的输入之后还有一个cin,并且之前的输入被应用到了当前的cin,用户没有机会输入。
  • 您是否尝试在两者之间添加std::cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n'); 之类的声明,或者只是一个std::cin.ignore()

标签: c++ input


【解决方案1】:

我想我会这样做:

std::getline(cin, your_string);

if (your_string.find_first_not_of("0123456789abcdefABCDEF") != std::string::npos)
    error("Non-hexadecimal input");
else {
    std::istringstream is(your_string);
    is >> std::hex >> address1;
}

有很多变化,但我要遵循的三个步骤是:

  1. 阅读整行,
  2. 验证它
  3. 如果好就转换。

【讨论】:

  • getline 的参数向后? std::getline(cin, s)cin.getline(s) 有什么优势吗?
  • @Ben:糟糕——已修复。谢谢你。 getline 的成员函数版本仅适用于 char 的缓冲区,其中全局适用于 std::strings。要完全安全地使用前者,您必须传递缓冲区大小,这不太方便。
【解决方案2】:

使用getline() 获取输入并逐步遍历字符串,确保只有数字和字母 A-F(可能还有前导 0x)

【讨论】:

  • 好吧,我必须用 sdt::cin 来做。有办法吗?
  • 当然,你可以用cin输入的字符串来做。
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 2016-05-04
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2021-12-26
  • 2018-03-16
相关资源
最近更新 更多