Я работаю над клавиатурной программой, которая будет работать как старый телефон для ввода символов в массив. Для этого назначения я ОБЯЗАН использовать типы указателей, поэтому я не могу просто изменить массив на обычный тип символа для решения проблемы. Проблема, с которой я сталкиваюсь, заключается в том, что после ввода первого символа, скажем, «55», программа правильно сохраняет «J» в первом слоте массива «месяц». Однако в следующий раз, когда я ввожу значение, он запускает правильный регистр переключения, но затем он дает мне нарушение прав доступа для доступа ко второму индексу month[1]
и разрывается. Я убедился, что мой ввод очищается в конце коммутатора, и он пытается запустить правильный регистр, поэтому я уверен, что он не связан с оператором switch. Я уверен, что это как-то связано с моим неправильным пониманием указателей. Я не понимаю, почему он не вводит второй символ, но не имеет проблем с вводом первого символа.
Я приложу указанный ниже код.
HEADER:
#include<string>
#include<iostream>
using namespace std;
class keypad
{
private:
char* month[45];
int* input;
int index = 0;
public:
keypad();
~keypad();
void getinput(int);
void getmonth();
void print()const;
void clear();
};
РЕАЛИЗАЦИЯ:
#include "keypad.h"
keypad::keypad() {
*month = new char;
input = new int;
}
keypad::~keypad() {
delete month;
delete input;
input = NULL;
*month = NULL;
}
void keypad::getinput(int a) {
*input = a;
}
void keypad::getmonth() {
switch (*input) {
case(2):
*month[index] = '2'; //The exception would be thrown right here if my second input is 2.
index++;
break;
case(22):
*month[index] = 'A';
index++;
break;
case(222):
*month[index] = 'B';
index++;
break;
case(2222):
*month[index] = 'C';
index++;
break;
case(3):
*month[index] = '3';
index++;
break;
case(33):
*month[index] = 'D';
index++;
break;
case(333):
*month[index] = 'E';
index++;
break;
case(3333):
*month[index] = 'F';
index++;
break;
case(4):
*month[index] = '4';
index++;
break;
case(44):
*month[index] = 'G';
index++;
break;
case(444):
*month[index] = 'H';
index++;
break;
case(4444):
*month[index] = 'I';
index++;
break;
case(5):
*month[index] = '5';
index++;
break;
case(55):
*month[index] = 'J';
index++;
break;
case(555):
*month[index] = 'K';
index++;
break;
case(5555):
*month[index] = 'L';
index++;
break;
case(6):
*month[index] = '6';
index++;
break;
case(66):
*month[index] = 'M';
index++;
break;
case(666):
*month[index] = 'N';
index++;
break;
case(6666):
*month[index] = 'O';
index++;
break;
case(7):
*month[index] = '7';
index++;
break;
case(77):
*month[index] = 'P';
index++;
break;
case(777):
*month[index] = 'Q';
index++;
break;
case(7777):
*month[index] = 'R';
index++;
break;
case(77777):
*month[index] = 'S';
index++;
break;
case(8):
*month[index] = '8';
index++;
break;
case(88):
*month[index] = 'T';
index++;
break;
case(888):
*month[index] = 'U';
index++;
break;
case(8888):
*month[index] = 'V';
index++;
break;
case(9):
*month[index] = 'W';
index++;
break;
case(99):
*month[index] = 'X';
index++;
break;
case(999):
*month[index] = 'Y';
index++;
break;
case(9999):
*month[index] = 'Z';
index++;
break;
case(1):
*month[index] = '1';
index++;
break;
default:
break;
}
*input = NULL;
}
void keypad::print()const{
cout << *month[index - 1] << endl;
}
void keypad::clear() {
delete month;
*month = NULL;
}
MAIN:
int main() {
cout << "READ ME" << endl;
cout << "For the purposes of this program, assume that ABC is on the number '2'." << endl;
cout << "Also, assume that the first press of any number key will input the number itself." << endl;
cout << "If your input is invalid, a character will not be saved, you may hit enter to restart the input for that character." << endl;
cout << "You will input the number for a single character then press enter to save that character. These must be done in order." << endl;
cout << "At any time after inputting a character, you may exit the program or clear the memory and input another word." << endl;
int tempinput;
keypad a;
bool loop = true;
bool endword = false;
bool toclear = false;
while (loop) {
cout << "input the numeric code for your desired character, EX: 22 = 'A'." << endl;
cin >> tempinput;
a.getinput(tempinput);
a.getmonth();
a.print();
}
}
Основная проблема возникает в файле реализации, где он выдает исключение в строке, где массиву назначается символ. Однако это происходит ТОЛЬКО со вторым символом, и первый сохраняется без проблем.
edit:
Я изменил код конструктора, чтобы инициализировать все индексы month
вместо одного, создав один для l oop для инициализации каждого month[i]
для нового символа.
Теперь у меня есть еще один вопрос, и я чувствую, что было бы разумнее, если бы я просто спросил здесь, потому что это тот же проект. Что может быть причиной того, что объект ofstream не будет записан? единственный раз, когда он используется в моем главном, и я закрыл его в конце.
int tempinput;
keypad a;
ofstream outfile;
outfile.open("output.txt");
while (true) {
cout << "input the numeric code for your desired character, EX: 22 = 'A'." << endl;
cin >> tempinput;
outfile << tempinput;
a.getinput(tempinput);
a.getmonth();
a.print();
}
outfile.close();
}