Доступ к массиву символов типа указателя в C ++ - PullRequest
0 голосов
/ 13 апреля 2020

Я работаю над клавиатурной программой, которая будет работать как старый телефон для ввода символов в массив. Для этого назначения я ОБЯЗАН использовать типы указателей, поэтому я не могу просто изменить массив на обычный тип символа для решения проблемы. Проблема, с которой я сталкиваюсь, заключается в том, что после ввода первого символа, скажем, «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();
    }
}

Основная проблема возникает в файле реализации, где он выдает исключение в строке, где массиву назначается символ. Однако это происходит ТОЛЬКО со вторым символом, и первый сохраняется без проблем.

here is the error in Visual Studio

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...