我是使用指標(和 Visual Studio 也是)的新手,我正在嘗試創建一個函式,該函式從 const 陣列中洗掉空格 ' '。該函式應該回傳另一個陣列,但沒有空格。看起來很簡單,代碼在 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;
}
運行代碼后出現什么
uj5u.com熱心網友回復:
“它有效”是未定義行為的最狡猾的形式,因為它可以誘使您相信某些事情是正確的 - 您正在分配的記憶體之外寫入,并且strcpy在源和目標重疊時未定義。
您使用了錯誤的記憶體分配形式:
new char(100):char值為 100的單曲new char[100]: 一個一百char秒的陣列。
(并且您需要為字串終止符留出空間。)
您也不需要先復制輸入,然后通過移位字符費力地修改副本,也不需要strcpy復制單個字符。
只需保留一些空間,然后只復制您想從輸入中保留的字符。
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;
}
uj5u.com熱心網友回復:
感謝 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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/346262.html
