void StrcatStr(char *s, char *t) {
while (*s != '\0');
while ((*s = *t ) != '\0');
}
int main() {
char str1[] = "abcd";
char str2[] = "sss";
StrcatStr(str1, str2);
printf("%s", str1);
return 0;
}
起初,我發現指標s指向字符'a',但接下來它指向字串中的無效字符。最后,系統告訴我變數周圍的堆疊 str1已損壞。為什么會發生這件事?指標不應該指向下一個s字符'b'嗎?
uj5u.com熱心網友回復:
定義
char str1[] = "abcd";
相當于
char str1[5] = { 'a', 'b', 'c', 'd', '\0' };
這意味著該陣列將只有五個元素。并且陣列不是動態的,并且在定義后不能擴展。
因此,將其用作任何類似strcat函式的目標都會超出范圍并給您未定義的行為。
您需要確保陣列中有足夠的空間來容納兩個字串,例如通過設定顯式大小(已知就足夠了):
// 30 should be more than enough to fit two 4-character strings plus the terminator
char str1[30] = "abcd";
uj5u.com熱心網友回復:
這里的問題是第一次,你應該寫 *( s) 而不是 *s 。使用 s ,您實際上是在回傳 s 的當前值,然后遞增是值,當您到達 '\0' 時會發生什么?s -> '\0',while 回圈中的條件現在為假,但您仍在增加值!所以你不是指向 '\0' 字符,而是指向它前面的 1 個字符。當您修改字串中的位元組時,您是第二個,并且考慮到仍然存在 '\0',printf 不會顯示第二個字串。使用 ( s) 您首先遞增并回傳新值,以便您可以在第一個字串的末尾停止,請注意,當您的第一個字串沒有字符時,您應該在單獨的情況下處理它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/450310.html
下一篇:如何找到一個大陣列中的所有回文?
