Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用std::cin验证十六进制输入?_C++_Input - Fatal编程技术网

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

C++ 如何使用std::cin验证十六进制输入?,c++,input,C++,Input,我使用了中的以下方法进行验证,但它不起作用: if (!(cin >> hex >>address1)) { cout << "Invalid input."; std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } if(!(c

我使用了中的以下方法进行验证,但它不起作用:

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

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

我想我会这样做:

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;
}
有很多变化,但我将遵循以下三个步骤:

  • 通读整行
  • 验证它
  • 如果好的话就转换

  • 你所说的“剩余输入”是什么意思?它应该占据所有内容,直到你点击回车键或者字符串中有空格为止。这意味着我在上面的输入之后有另一个cin,之前的输入应用于当前的cin,用户没有机会输入任何内容。你是否尝试过使用类似
    std::cin.ignore这样的语句(std::numeric_limits::max(),“\n”);
    介于两者之间,或者只是一个
    std::cin.ignore()
    ?我必须用sdt::cin来做。有什么方法可以做吗?当然,你可以用cin输入的字符串来做。
    getline
    的参数向后?std::getline(cin,s)
    cin.getline(s)有什么优势吗
    ?@Ben:Oops——修复了。谢谢。成员函数版本的
    getline
    仅适用于char缓冲区,而全局函数则适用于
    std::string
    s。要安全使用前者,必须传递缓冲区大小,这不太方便。