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。要安全使用前者,必须传递缓冲区大小,这不太方便。