Проверка целочисленного ввода в C ++ - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь проверить ввод, принять только целые числа, и он работает нормально для букв и десятичных знаков после 4. Например, если я введу 1.22, он будет читать только номер один и go до бесконечности l oop, но когда я ввожу число, которое больше 4, например, 5.55, тогда оно работает хорошо, как я могу решить эту проблему? Спасибо и ценим вашу помощь!

void Furniture::getSelection()
{
    do {
        cout << "\nWhich object would you like to measure:\n"
             << "1.Table\n"
             << "2.Stool\n"
             << "3.Bookshelf\n"
             << "4.Exit\n" << endl;   

        while(!(cin >> choice)) {
            cerr << "The format is incorrect!" << endl;
            cin.clear();
            cin.ignore(132, '\n');
        }
        while(choice != 1 && choice != 2 && choice != 3 && choice != 4) {
            cerr << "Invalid Input!!Try again\n" << endl;
            break;
         }
    } while(choice != 1 && choice != 2 && choice != 3 && choice != 4);

1 Ответ

1 голос
/ 19 марта 2020

Вот краткий пример программы, которая может обеспечить ввод ASCII от 1 до 4 включительно.

#include <exception>
#include <iostream>
#include <string>

int menu_selection() {
  int choice = 0;
  std::string input;

  do {
    std::cout << "\nWhich object would you like to measure:\n"
              << "1. Table\n"
              << "2. Stool\n"
              << "3. Bookshelf\n"
              << "4. Exit\n\n";
    std::getline(std::cin, input);

    // Handles the input of strings
    std::string::size_type loc = 0;
    try {
      choice = std::stoi(input, &loc);
    } catch (std::exception& e) {  // std::stoi throws two exceptions, no need
                                   // to distinguish
      std::cerr << "Invalid input!\n";
      continue;
    }

    // Handles decimal numbers
    if (loc != input.length()) {
      choice = 0;
    }

    // Handles the valid range
    if (choice < 1 || choice > 4) {
      std::cerr << "Invalid Input! Try again\n\n";
    }

  } while (choice < 1 || choice > 4);

  return choice;
}

int main() {
  int selection = menu_selection();

  std::cout << "You chose " << selection << ".\n";
}

Этот код не относится к вашему классу мебели. Выбор мебели - это не «бытие». Меню и выбор должны быть вне класса, а затем вы делаете соответствующие вызовы для вашего класса мебели.

Еще один способ думать об этом - делиться классом Мебель с другими разработчиками. Может быть, им нет дела до измерения мебели. Но теперь вы навязали им это измерение, включив его в класс.

...