程序终止会导致堆栈损坏?

时间:2019-04-22 23:50:31

标签: c++ pointers stack-corruption

我正在写一个作业的程序,但不太了解我在做什么错。该程序接受一些文本输入,并以猪拉丁语输出它,而现在该程序实现了该功能,但程序终止时出现堆栈损坏,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;
}

我不确定如何解决此问题,但是如果我能得到一些帮助以及对我做错了什么的简单说明,我将不胜感激,因为指针算术对我来说很乱。 / p>

谢谢!

1 个答案:

答案 0 :(得分:3)

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代替char数组,对无限行长使用getline(cin, text);