C++ 项目在 Visual Studio 2019 中触发了一个断点

C++ Project has triggered a breakpoint in Visual Studio 2019

我不熟悉使用指针(Visual Studio 也是),我正在尝试创建一个函数,从 const 数组中删除空格“ ”。该函数应该 return 另一个数组但没有空格。看起来很简单,代码在Codeblocks中运行,但在Visual Studio中它一直触发断点。知道我做错了什么吗?

char* removeSpaces(const char* text) {
    int length = strlen(text);
    char* clone = new char(strlen(text));
    strcpy_s(clone,length+1, text);
    int i = 0;
    do {
        if (clone[i] == ' ')
            strcpy(clone + i, clone + i + 1);
        i++;
    } while (i < length);

    return clone;
}

What appears after I run the code

感谢 dratenik 和 user1810087 我设法使用字符串并找到了解决方案,谢谢。

char* removeSpaces(const char* text) {
    int length = strlen(text);
    string clone(text);

    clone.erase(remove_if(clone.begin(), clone.end(), isspace), clone.end());

    char* cclone = new char[clone.length()];

    for (int i = 0; i <= clone.length(); i++)
        cclone[i] = clone[i];

    return cclone;
}

“It works”是未定义行为的最狡猾的形式,因为它可以诱使您相信某些事情是正确的 - 您正在分配的内存之外写入,并且 strcpy 在源代码时未定义和目的地重叠。

您使用了错误的内存分配形式:

  • new char(100):单个 char,值为 100
  • new char[100]:一百个char的数组。

(字符串终止符需要 space。)

您也不需要先复制输入然后费力地通过移动字符来修改副本,并且您不需要strcpy复制单个字符。

只保留一些space,然后从输入中只复制你想保留的字符。

char* removeSpaces(const char* text)
{
    int length = strlen(text);
    char* clone = new char[length+1];
    int copy_length = 0
    for (int original = 0; original < length; original++)
    {
        if (text[original] != ' ')
        {
            clone[copy_length] = text[original];
            copy_length++;
        }
    }
    clone[copy_length] = 0;
    return clone;
}