Профессионалы с++ помогите!
Мне нужно сделать такую вещь: я создал динамический массив типа char arr; выделил под него 10 ячеек памяти. В программе мы сами должны ввести этот массив, допустим я использовал 4 ячейки памяти (написал слово "Пушки") , и мне нужно ввести условие : если arr[5] существует, то я вывожу ошибку: cout << "Ошибка №1 - неизвестный раздел! Попробуйте перезапустить программу! \n";
как это сделать? Пробовал вот-так - не помогло: #include "pch.h"
#include
#include
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
cout << "Википедия - Танки Онлайн\n";
cout << "Выберите раздел: \n" << "Пушки\n" << "Корпуса\n" << "Модули\n" << "Краски\n" << endl;
char *arr = new char[10];
cin >> arr;
try {
if (isalnum(arr[5]))
throw 1;
if ((arr[0] == 'п' && arr[1] == 'у' && arr[2] == 'ш' && arr[3] == 'к' && arr[4] == 'и' && strlen(arr) == 5) || (arr[0] == 'П' || arr[1] == 'У' || arr[2] == 'Ш' || arr[3] == 'К' || arr[4] == 'И' && strlen(arr) == 5)) {
cout << endl;
cout << "Выберите пушку: \n" << "Смоки\n" << "Огнемёт\n" << "Твинс\n" << "Рельса\n" << "Изида\n" << "Гром\n" << "Фриз\n" << "Рикошет\n" << "Шафт\n" << "Молот\n" << "Вулкан\n" << "Страйкер\n" << "Магнум\n" << "\n";
char *arr2 = new char[10];
cin >> arr2;
if (arr2[0] == 'с' && arr2[1] == 'м' && arr2[2] == 'о' && arr2[3] == 'к' && arr2[4] == 'и' && strlen(arr2) == 5) {
cout << endl;
cout << "Выберите модификацию пушки: \n" << "М0\n" << "М1\n" << "М2\n" << "M3\n" << "M4\n" << "\n";
char *arr3 = new char[10];
cin >> arr3;
if (arr3[0] == 'м' && arr3[1] == '0' && strlen(arr3) == 2) {
cout << endl;
cout << "Пушка доступена со звания новобранец\n" << "Цена модификации (в кристаллах) - 0\n" << "Урон минимальный (в hp) - 210\n" << "Урон максимальный (в hp) - 330\n" << "Сила удара (в условных единицах) - 150\n" << "Отдача (в условных единицах) - 100\n" << "Перезарядка (в секундах) - 1.8\n" << "Скорость поворота (в градусах за секудну) - 70\n" << "Ускорение поворота (в градусах за секунду²)- 70\n" << "Дальность минимального поражения (в метрах) - 100\n" << "Дальность максимального поражения (в метрах) - 70\n" << "Шанс критического урона (в процентах) - 11.5\n" << "Минимальный шанс критического урона (в процентах) - -12\n" << "Критический урон (в hp) - 700\n" << "Начальный шанс критического урона (в процентах) - 0\n" << "Процент слабого поражения (в процентах) - 50\n" << "Автоприцел угол вверх (в градусах) - 9\n" << "Автоприцел угол вниз (в градусах) - 12\n";
cout << endl;
}
else {
cout << endl;
cout << "Ошибка №1 - неизвестный раздел! Попробуйте перезапустить программу! \n";
}
delete[] arr3;
}
else {
cout << endl;
cout << "Ошибка №1 - неизвестный раздел! Попробуйте перезапустить программу! \n";
}
delete[] arr2;
}
else {
cout << endl;
cout << "Ошибка №1 - неизвестный раздел! Попробуйте перезапустить программу! \n";
}
delete[] arr;
}
catch (int job) {
cout << "Ошибка №" << job << " - неизвестный раздел! Попробуйте перезапустить программу! \n";
}
system("pause");
}
так же пытался экспериментировать с условиями if, но не помогло, кто поможет буду очень благодарен)
1. Проверка arr[5] имеет смысл, только если strlen(arr) >= 5. Если, например, в arr записана строка "И", то в arr[5] может быть любой мусор. Потому проверкой arr[5] ты ничего не добьёшься - надо проверять не значение символа, а длину строки.
2. Для сравнения строк-массивов есть функция strcmp и её модификации. Никто в здравом уме не будет сравнивать массив со словом "пушки" посимвольно.
Ну раз уж используем полноценный C++, то почему бы не использовать его возможности для организации вложенного меню?
Хинт: внутри обработчиков cannon(), painting() итд тоже можно по аналогии с main() сделать подменю.
#include <iostream>
#include <string>
#include <map>
using namespace std;
typedef void (*LPCALLBACK)();
typedef map<string, LPCALLBACK> CALLMAP;
void choice(CALLMAP options) {
string choice;
cout << "Выберите раздел:" << endl;
while (true) {
for (CALLMAP::iterator i = options.begin(); i != options.end(); i++) {
cout << i->first << endl;
}
cin >> choice;
if (options.count(choice)) {
options[choice]();
break;
}
cout << "Раздел не найден. Попробуйте ещё раз:" << endl;
}
}
void cannon() {
cout << "Вы выбрали пушки" << endl;
}
void body() {
cout << "Вы выбрали корпуса" << endl;
}
void module() {
cout << "Вы выбрали модули" << endl;
}
void painting() {
cout << "Вы выбрали краски" << endl;
}
int main() {
CALLMAP options;
options["Пушки"] = cannon;
options["Корпуса"] = body;
options["Модули"] = module;
options["Краски"] = painting;
choice(options);
return 0;
}
попробуй изменить шрифт в консоли на другой, ибо когда ты вводишь текст через std::cin в свой массив, то туда записываются каракули... потом при проверке функцией isalnum происходит аварийное завершение программы.
Можно использовать функцию system(), чтобы перезапустить.
А можно использовать goto с меткой на начало программы.