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 не обрабатывает событий консоли.
20.05.2019, 13:51 [1722 просмотра]