c++ - 使用 cin 丢弃数字以外的字母

标签 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;
    }
}

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

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/

相关文章:

java - 1-10 之间的正整数的阶乘。问题: Works only if valid input is greater than previous input

c++ - 中止核心转储 C++

c++ - 如何在 CMakeLists.txt 文件中的第三方库头文件中抑制 Clang 警告?

c++ - Linux 命令检测程序的计算机资源使用情况

c++ - 这里声明了什么?

jquery - 设置 jQuery 按钮宽度输入类型 ="button"

c++ - 是否可以从构造函数自动推导出基类模板参数?

c# - 将 VirtualKey 映射到 UWP 应用程序中的字符,独立于布局

javascript - 输入无效时显示工具提示

javascript - 通过自动完成功能输入相互依赖的文本