Повреждение стека при завершении программы? - PullRequest
0 голосов
/ 23 апреля 2019

Я пишу программу для домашнего задания и не могу понять, что я делаю неправильно. Программа берет некоторый текстовый ввод и выводит его на латинском языке, и хотя теперь программа достигает этого, при завершении программы происходит повреждение стека, при этом VS упоминает «Ошибка проверки времени выполнения # 2 - стек вокруг переменной« token »был поврежден. "

Я подозреваю, что это происходит из-за того, что каким-то образом пересекает границы указателя, но в настоящий момент я не совсем понимаю указатели, поэтому большинство вещей, которые я нашел, на самом деле не имеют смысла, и я пытаюсь понять, а не просто исправить то, что я сделал не так.

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

int main(void)
{
    char text[] = "";
    char seps[] = " \t\n";
    char *token = NULL;
    char *next_token = NULL;
    bool cont = true;
    bool valid = false;
    char contResp;

    cout << "Enter a sentence to be translated: ";

    do
    {
        cin.getline(text, 200);
        cout << endl << text << endl;
        token = strtok_s(text, seps, &next_token);
        while (token != NULL)
        {
            if (token != NULL)
            {
                printLatinWord(token);
                token = strtok_s(NULL, seps, &next_token);
            }
        }
        cout << endl << endl << "Do you want to enter another sentence (y/n)? ";
        valid = false;
        while (!valid)
        {
            cin >> contResp;
            contResp = tolower(contResp);
            if (contResp == 'y')
            {
                valid = true;
                cin.ignore();
                cout << "Enter a sentence to be translated: ";
            }
            else if (contResp == 'n')
            {
                valid = true;
                cont = false;
            }
            else
            {
                cout << "Invalid response. Please try again.";
                cout << endl << endl << "Do you want to enter another sentence (y/n)? ";
            }
        }
    } 
    while (cont);
    system("pause");
    return 0;
}

void printLatinWord(char *token)
{
    string text = "";
    char *first = token;
    token++;
    while (*token != '\0')
    {
        text += *token;
        token++;
    }
    text += *first;
    text += "ay ";
    cout << text;
}

Я не уверен, как решить эту проблему, но если бы я мог получить некоторую помощь, а также простое объяснение того, что я сделал неправильно, я был бы очень признателен, так как арифметика с указателями в основном для меня бессмысленна.

Заранее спасибо!

1 Ответ

3 голосов
/ 23 апреля 2019
char text[] = "";

Это создает 1-байтовый массив для хранения символа '\0' (терминатор NUL). Это так же, как:

char text[1];
text[0] = '\0';

cin.getline(text, 200);

Это записывает до 200 символов - 199 символов плюс терминатор NUL - в массив из 1 символа.

Очевидное решение: сделать массив длиной 200 символов.

char text[200] = "";

В качестве альтернативы используйте std::string для text вместо массива символов и используйте getline(cin, text); для неограниченной длины строки.

...