我现在有这个循环,它读取数字并以十进制、八进制和十六进制输出它们:
while(1) {
if (cin >> n)
cout << internal << setfill(' ') << setw(10) << dec << n << internal << setw(12) << oct << n << internal << setw(9) << hex << uppercase << n << endl;
if (cin.fail()) {
break;
}
}
但是,如果我尝试丢弃不是数字的输入,它不会在字母后读取输入:
if (cin.fail()) {
cin.ignore();
}
如何丢弃输入但稍后能够读取其他输入?
示例输入:
23
678 786 abc
7777
预期输出:十进制、十进制、十六进制
23 27 17
678 1246 2A6
786 1422 312
7777 17141 1E61
最佳答案
您需要使用 cin
中的违规内容并重置错误状态。只要设置了failbit
,所有输入操作都会立即失败。
while(1) {
if (cin >> n)
cout << internal << setfill(' ') << setw(10) << dec << n << internal << setw(12) << oct << n << internal << setw(9) << hex << uppercase << n << endl;
else {
if (cin.eof())
break;
cin.clear(); // Reset the error state
std::string dummy;
if (!(cin >> dummy)) // Consume what ever non-integer you encountered
break;
}
}
或者,您总是可以读取一个std::string
,然后尝试用std::stoi
将它解析为一个数字。 :
for (std::string word; std::cin >> word;) {
try {
int n = std::stoi(word);
// You output logic here
}
catch (std::exception&) {}
}
但这可能会过度使用异常,因为您声明无效输入并非异常。从好的方面来说,这意味着“手动”执行更少的逻辑。
关于c++ - 使用 cin 丢弃数字以外的字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32673263/