БлогNot. C++: простейшее консольное меню с вводом номера пункта из cin

C++: простейшее консольное меню с вводом номера пункта из cin

...если не хочется прибегать к getch(), внешним модулям и прочим не-кроссплатформенным решениям.

В показанном примере меню предполагает ввод целочисленных числовых значений для выбора действия. Пока вводится что-то другое, меню не будет ничего делать, удаляя лишние данные из буфера потока ввода, например (показана копия текста из консоли):

1. Do
2. Another do
0. Exit
sdsds
wewewew
1

Do 1
1. Do
2. Another do
0. Exit

Вот как выглядит текст этой программы:

#include <iostream>
#include <cstdlib>
#include <limits>
using namespace std;

void clearBuf() {
 cin.clear();
 cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

int main() {
 int n;
 do {
  cout << "1. Do\n2. Another do\n0. Exit" << endl;
  while (!(cin >> n)) clearBuf();
  clearBuf();
  switch (n) {
   case 1: cout << endl << "Do 1" << endl; break;
   case 2: cout << endl << "Do 2" << endl; break;
   case 0: exit(0); break;
   default: continue;
  }
 } while (1);
}

С символами типа char в качестве обозначений пунктов меню можно поступить аналогично, просто поменяв тип переменной и преобразовав первый подходящий из введённых символов к нижнему регистру:

#include <iostream>
#include <cstdlib>
#include <limits>
#include <cctype>
using namespace std;

void clearBuf() {
 cin.clear();
 cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

int main() {
 char n;
 do {
  cout << "A. Do\nB. Another do\nE. Exit" << endl;
  while (!(cin >> n)) clearBuf();
  n = tolower(n);
  clearBuf();
  switch (n) {
  case 'a': cout << endl << "Do 1" << endl; break;
  case 'b': cout << endl << "Do 2" << endl; break;
  case 'e': exit(0); break;
  default: continue;
  }
 } while (1);
}

Примеры проверены в консолях Visual Studio 2015 и QT 5.X.

В QT понадобится дополнительно нажать Enter для выхода из приложения, так как QT не обрабатывает событий консоли.


теги: учебное c++ программирование

20.05.2019, 13:51; рейтинг: 468