RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 578754
Accepted
E1mir
E1mir
Asked:2020-10-16 19:27:36 +0000 UTC2020-10-16 19:27:36 +0000 UTC 2020-10-16 19:27:36 +0000 UTC

输入字符时无限循环

  • 772

下午好!在 C++ 上做实验室工作时,我遇到了以下问题:

我有一个readCommand读取命令的静态方法...并在成功输入后,将此命令传递给另一个方法choose(index)...

一切正常,但有这样一个问题,当输入数字时,一切正常,工作..但是如果你不小心输入的不是数字,而是符号或字母,方法中的循环将无限运行......

这是代码:

static void readCommand(){
    cout << endl <<"Select one: ";
    while(true){
        int index = 0;
        cin >> index;
        if(index < 1 || index > 4){
            cout << endl << "INDEX UNDEFINED!" << endl;
            cout << endl << "Select again: ";
        } else{
            choose(index);
            break;
        }
    }
}

该程序的工作原理如下:

程序示例

如何解决?作为 Java 鉴赏家,我知道您可以通过添加异常处理程序轻松避免这种情况。只有在 C++ 中我不知道该怎么做。

c++
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. Best Answer
    yrHeTateJlb
    2020-10-16T19:58:36Z2020-10-16T19:58:36Z

    假设我们需要读取一个整数

    int value;
    std::cin >> value;
    

    如果用户输入了错误的内容,线程会将其状态从good更改为fail。你可以这样检查:

    int value;
    std::cin >> value;
    if(std::cin.fail()){
        //Как-то боремся с проблемой
    }
    

    或者更短的符号:

    int value;
    std::cin >> value;
    if(!std::cin){
        //Как-то боремся с проблемой
    }
    

    现在如何处理这个问题:

    int value;
    std::cin >> value;
    if(!std::cin){
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //Выкидываем все что ввел пользователь до конца строки
        std::cin.clear();  //Убираем флаг ошибки. Теперь состояние потока снова good
    
    }
    

    就这样。添加此检查,一切都会起作用。也可以显示错误信息
    http://cpp.sh/9by3m

    • 4
  2. avp
    2020-10-16T19:49:57Z2020-10-16T19:49:57Z

    问题是输入gg的不是预期的数字cin >> index。

    这些字符保留在输入流中,并尝试在循环中再次读取它们。可能最简单的方法是在重试之前将所有数据读取到行尾。

    请注意,在检测到错误后,cin 将处于不健康状态,必须从该状态退出。当然,我知道你有一个 C++ 实验室(甚至现在我会看到它是如何交叉完成的),但我真诚地建议你在实践中使用 C 输入输出工具(它更容易)。

    这是一个有效的示例(即使在输入错误状态下也能处理 EOF)

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      for (;;) {
        int v;
        cin >> v;
        if (!cin.good()) {
          if (cin.eof())
            cout << "eof\n";
          else {
            cout << "err\n";
            cin.clear();
            char c;
            while (cin.good() && (c = cin.get()) != '\n');
            if (cin.good()) {
              cout << "again\n";
              continue;
            } else {
              if (cin.eof())
                cout << "Eof\n";
              else
                cout << "Err\n";
              break;
            }
          }
          break;
        } else
          cout << "v = " << v << '\n';
      }
    }
    
    • 2
  3. Osyotr
    2020-10-16T19:53:44Z2020-10-16T19:53:44Z

    C++ 有一个类stringstream. 要使用它,您需要添加#include <string>和#include <sstream>。以下代码使用其流执行安全数字输入。

    int data;
    string buffer = "";
    cout << "Введите данные: " << endl;
    
    while (true) 
    {
        getline(cin, buffer);
    
        // Безопасный перевод из строки в число.
        stringstream myStream(buffer);
        if ( (myStream >> data) )
            break;
        cout << "Неверный ввод, повторите..." << endl;
    }
    
    • 2
  4. Harry
    2020-10-16T19:52:29Z2020-10-16T19:52:29Z

    用于cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')在无效输入后刷新缓冲区...

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5