strcpy、strcmp、strcat?標準庫函式雖好用,但面試、考試、嵌入式環境常要求手寫實作。深入理解指標走訪、字串結束判斷 (\0)、記憶體邊界處理,是 C 語言功力的試金石。本課完整實作 6 大字串核心操作。
strReplacevoid strReplace(char *soucrStr, char *replaceStr, int pos) {
while (pos > 0 && *soucrStr != '\0') { soucrStr++; pos--; } // 移至指定位置
while (*soucrStr != '\0' && *replaceStr != '\0') {
*soucrStr = *replaceStr; // 逐字元取代
soucrStr++; replaceStr++;
}
}
strCopy (對應 strcpy)char *strCopy(char *distStr, const char *sourceStr) {
char *address = distStr; // 保存起始位址供返回
while ((*distStr++ = *sourceStr++) != '\0'); // 賦值、比較、遞增一次完成
return address;
}
關鍵細節:*distStr++ = *sourceStr++ 利用後置遞增優先級,先取值賦值再移動指標。迴圈條件直接判斷賦值結果是否為 \0,極度精簡。
strCompare (對應 strcmp)int strCompare(char *str1, char *str2) {
while (*str1 && *str2 && (*str1 == *str2)) { str1++; str2++; }
return *str1 - *str2; // 相同=0,str1大=正,str2大=負
}
strConcat (對應 strcat)char *strConcat(char *distStr, char *sourceStr) {
char *address = distStr;
while (*distStr) distStr++; // 先找到目的字串尾端 (\0)
while ((*distStr++ = *sourceStr++) != '\0'); // 接上來源字串
return address;
}
易錯點:尋找尾端時不能用 while(*distStr++),否則指標會多移一格導致殘留 \0 被覆蓋錯位。
strConvertvoid strConvert(char *str) {
int len = strLength(str), mid = len / 2;
for (int i = 0; i < mid; i++) {
char tmp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = tmp; // 首尾交換,僅需跑一半
}
}
strLength (對應 strlen)int strLength(char *str) {
int len = 0;
while (*str++) len++; // 指標走訪計數
return len;
}
void strOperate() {
char source[] = "China", rep[] = "ese";
strReplace(source, rep, 4); puts(source); // Chinese
char distStr[10]; strCopy(distStr, "abcdefg"); puts(distStr); // abcdefg
printf("%d\n", strCompare("ABCD", "ABC")); // 1 (D > \0)
printf("%d\n", strLength("ABCDe")); // 5
char sc[30] = "Chinese";
strConcat(sc, " FUCK Japanese"); puts(sc); // Chinese FUCK Japanese
char s[] = "I love my homeland";
strConvert(s); puts(s); // dnalorhd ym evol I
}
strCopy/strConcat 不檢查目的緩衝區大小,實務必用 strncpy/strncat 或 snprintfstrReplace 若取代字串較長會越界覆蓋後續記憶體手寫字串函式不只是背誦程式碼,而是要內化「指標走訪 + \0 判斷 + 邊界意識」這三大核心模式。建議在紙上推導每個函式的指標移動軌跡,直到能閉眼寫出為止。