首页 文章

c - 输入验证将数字放入向量

提问于
浏览
1

我一直在尝试创建一个简单的while循环来将数字转换为向量,并进行一些基本的输入验证 . 但是,我发现我的代码发生了一些奇怪的事情 . 我试图让它用户可以输入数字,直到他们输入'0',然后结束循环 . 这很好用 .

但是,我也试图这样做,如果他们输入一个非int(即3.4,a),或者如果他们输入一个负数,它会输出“BAD INPUT”然后退出程序 . 当我输入负数时,它工作正常 . 但是当我输入一个非int时,它不会有任何问题,但仍会退出程序......

同样地,我也试图让它如此,如果他们先输入'0',而没有预先输入任何数字,它会输出“NO NUMBERS”并退出程序 . 这个也退出了程序,但同样,不会有任何问题 .

我的代码如下:

#include <iostream>
   #include <vector>

   //I know it is considered bad practice for the below part.
   using namespace std;

   int main() 
   {
        vector<int> numberStorage;

        while (cin) {
            int numInput = 0;

            cin >> numInput;

            if (numInput == 0) break;

            if (!cin || numInput < 0) {
                cout << "BAD INPUT" << '\n';
                return false;
            }

            if (numInput == 0 && numberStorage.size() == 1) {
                cout << "NO NUMBERS" << '\n';
                return false;
            }   
            numberStorage.push_back(numInput);
        }

        return 0;
    }

任何人都可以帮助我并澄清我的逻辑/代码在这些输入验证中出错的地方吗?感谢您的任何帮助 .

4 回答

  • 3

    试试这个:

    #include <iostream>
    #include <vector>
    //I know it is considered bad practice for the below part.
    using namespace std;
    
    vector<int> numberStorage;
    
    int main() {
      while (true) {
        int numInput = 0;
    
        cin >> numInput;
    
        if (cin.fail() || numInput < 0) {
          cout << "BAD INPUT" << '\n';
          break;
        }
    
        if (numInput == 0) {
          cout << "Received 0" << endl;
          break;
        }
    
        if (numInput == 0 && numberStorage.size() == 1) {
          cout << "NO NUMBERS" << '\n';
          return false;
        }   
        numberStorage.push_back(numInput);
      }
    
      return 0;
    }
    

    在原始代码中,您没有检查cin.fail() . 当你试图在numInput中存储一个不是int的值时,cin无声地失败,当你初始化numInput为0时,它正在退出循环,好像客户端在控制台上输入了数字零一样 .

    您可以通过在原始代码的零值条件上添加cout来自行检查 .

    干杯

  • 3

    When cin fails, it will assign value 0numInput 和你的逻辑

    if (numInput == 0) break;
    

    默默地退出该计划 .

  • 1

    您可以在设置整数之后使用cin.fail()进行检查,以便检查不是数字 .

    #include <iostream>
    #include <vector>
    using namespace std;
    
    vector<int> numberStorage;
    
    int main() {
        while (cin) {
            int numInput = 0;
    
            cout << "Please enter:";
            cin >> numInput;
    
            if(cin.fail()) {
                cout << "NO NUMBER" << "\n";
            }
    
            if (numInput == 0) break;
    
            if (!cin || numInput < 0) {
                cout << "BAD INPUT" << '\n';
                return false;
            }
    
            numberStorage.push_back(numInput);
        }
    }
    

    结果如下:https://onlinegdb.com/SyIWdqU9m

  • 0

    如果在 cin.fail() 发生的情况下调用 cin.clear() 以清除 cin 上的错误标志,那么将来的I / O操作将正常工作将是一个很好的做法 .

    只是推荐!

相关问题