gpt4 book ai didi

c++ - 通过错误处理可靠地获取C++中的用户十六进制输入

转载 作者:行者123 更新时间:2023-12-01 14:43:23 24 4
gpt4 key购买 nike

我已经在互联网上浏览了一段时间,并且发现以十六进制数字形式获取用户输入的C++方法是使用cin >> hex >> variable。我目前无法在自己的情况下使用此功能。这是我要针对一系列用户输入进行的操作:

>0xFF    -> variable = 0xFF;
>FF -> variable = 0xFF;
>122 -> variable = 0x122;
>garbage -> ask again;
>0XFfFfA -> variable = 0xFFFFA;

这是我的代码及其问题:

int endAddr;
do { printf("Enter end addr: "); } while (!(cin >> hex >> endAddr));

问题:输入垃圾后,它继续循环打印出“Enter end addr:”,而不是让用户重试。

有关此代码段的任何帮助将非常有用。提前致谢。

编辑:

根据建议,我查看了 this post并相应地调整了我的代码:
while (true) {
printf("Enter start addr: ");
if (cin >> hex >> startAddr) {
break;
}
cin.clear();
cin.ignore();
}
//rest of code

现在的问题是,如果我输入诸如 le之类的字符串,它将再次打印提示,但随后会继续处理其余代码。为什么是这样?如果我删除 cin.ignore(),它会执行上面所述的循环操作。

最佳答案

cin.ignore()将忽略其内部缓冲区中的最后一个字符。您需要使用cin.ignore(std::numeric_limits<std::streamsize>::max())重置回上一个EOF。然后,您可以可靠地检查下一个输入。

在尝试解决这个问题(使用流:D的良好实践)之后,我想出了一个解决方案

    int startAddr;
std::cin.exceptions(std::ios_base::failbit);

while (true) {
std::cout << "Enter start addr: ";

try {
std::cin >> std::hex >> startAddr;
break;
} catch(std::exception&) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
std::cout << "Invalid number\n";
}
}

这利用了将故障位设置为 std::iostream的异常的能力,这意味着我们可以保证捕获错误和 std::numeric_limits作为清除缓冲区的更可靠方法

关于c++ - 通过错误处理可靠地获取C++中的用户十六进制输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60342715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com