字串常量 "welcome to www.bkjia.com" 本質是以 '\0' 結尾的字符陣列。傳遞給函數時,實際傳遞的是指向首字符的指標。printf 等函數正是透過這個指標訪問字串內容。
void stringcopy(char *source, char *target) {
int i = 0;
while ((source[i] = target[i]) != '\0')
i++;
}
利用賦值表達式的值為賦值結果的特性,複製並同時檢查結束符。
void stringcopy(char *source, char *target) {
while ((*source++ = *target++) != '\0')
;
}
*source++ 先取值賦值,再將指標後移; 精簡極致void stringcopy(char *source, char *target) {
while (*source++ = *target++)
;
}
C 語言中非零為真、零為假。*target++ 為 '\0' 時賦值結果為 0,循環自然終止。這是 C 程序員慣用的「地道寫法」。
char str_a[] = "Welcome to www.bkjia.com"; char str_b[] = ""; stringcopy(str_b, str_a); // 注意參數順序:目標在前,來源在後 // 輸出結果: // str_a 為 Welcome to www.bkjia.com // str_b 為 // 調用函數後 // str_a 為 o www.bkjia.com <-- 關鍵觀察點! // str_b 為 Welcome to www.bkjia.com
因參數按值傳遞,函數內 source 和 target 是指標副本。循環中兩指標同步前進,最終將來源字串完整複製到目標。但主函數中 str_a 陣列內容被覆寫,因為 str_b 空間不足(僅 1 字節存 '\0'),導致緩衝區溢出,破壞了 str_a 的後續內容。
strncpy、strlcpy 或 strcpy_s這不只是炫技,而是C 語言表達能力的核心體現:指標運算、賦值表達式值、零值判斷三位一體。掌握它,才能閱讀系統級代碼(如內核、標準庫實現),並寫出高效、緊湊的底層邏輯。