c ++ - проверка ввода, вставка чисел в вектор - PullRequest
0 голосов
/ 06 октября 2018

Я пытался создать простой цикл 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 ]

0 голосов
/ 07 октября 2018

Было бы неплохо, если бы вы вызывали cin.clear(), если cin.fail() происходит, чтобы сбросить флаг ошибки на cin, чтобы будущие операции ввода-вывода работали правильно.

Просто рекомендация!

0 голосов
/ 06 октября 2018

Вы можете проверить с помощью 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 голосов
/ 06 октября 2018

При сбое cin ему присваивается значение 0 для numInput и ваша логика

if (numInput == 0) break;

, молча выходя из программы.

0 голосов
/ 06 октября 2018

Попробуйте:

#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, cin молча терпел неудачу, и когда вы инициализировали numInput равным 0, он выходил из цикла, как если бы клиент ввел нулевое число на консоли.

Вы можете проверить это самостоятельно, добавив метку на условие нулевого значения исходного кода.

cheers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...