丢弃带有cin的数字以外的字母

kho*_*n_t 6 c++ input

我现在有这个循环读入数字并以十进制,八进制和十六进制输出:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试丢弃不是数字的输入,它将不会在字母后面的输入中读取:

if (cin.fail()) {
    cin.ignore();
}
Run Code Online (Sandbox Code Playgroud)

如何丢弃输入但稍后可以读取其他输入?

样本输入:

23
678  786  abc
7777
Run Code Online (Sandbox Code Playgroud)

预期输出:dec,oct,hex


    23          27       17
   678        1246      2A6
   786        1422      312
  7777       17141     1E61
Run Code Online (Sandbox Code Playgroud)

Bau*_*gen 2

您需要使用其中的违规内容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;
  } 
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以始终读取 a std::string,然后尝试使用以下命令将其解析为数字std::stoi

for (std::string word; std::cin >> word;) {
    try {
        int n = std::stoi(word);
        // You output logic here
    }
    catch (std::exception&) {}
}
Run Code Online (Sandbox Code Playgroud)

但这可能会过度使用异常,因为您声明无效输入并不例外。从好的方面来说,这意味着“手动”执行更少的逻辑。