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;
}
我不熟悉使用指针(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
,值为 100new 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;
}