如何使用std :: cin验证十六进制输入?

时间:2011-03-18 03:05:20

标签: c++ input

我在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被清除并被忽略。

2 个答案:

答案 0 :(得分:5)

我想我会做这样的事情:

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. 如果好的话就转换。

答案 1 :(得分:1)

使用getline()抓取输入并逐步执行字符串,确保只有数字和字母A-F(可能是前导0x)