strcpyvoid strcpy1(char str1[], char str2[]) {
int i = 0;
for (; str2[i] != '\0'; ++i) str1[i] = str2[i];
str1[i] = '\0';
}
void strcpy2(char str1[], char str2[]) {
int i = 0;
while (str1[i] = str2[i]) ++i; // 賦值結果即為字符值,'\0' 為假結束循環
}
版本 2 更簡潔,利用 C 語言「賦值表達式的值即為賦值結果」的特性,無需額外判斷。
strlenint strlen1(char str[]) {
int i = 0;
while (str[i] != '\0') ++i;
return i;
}
int strlen2(char *str) {
char *t = str;
while (*str != '\0') ++str;
return str - t; // 指針差即為元素個數
}
版本 2 體現指針算術優雅性,無需計數變量。
strcmpint strcmp1(char str1[], char str2[]) {
int i = 0;
for (; str1[i] != '\0'; ++i)
if (str1[i] != str2[i]) break;
return str1[i] - str2[i]; // 返回首個不同字符的 ASCII 碼差
}
int strcmp2(char *str1, char *str2) {
for (; *str1 != '\0'; ++str1, ++str2)
if (*str1 != *str2) break;
return *str1 - *str2;
}
版本 2 直接操作指針,更符合 C 風格,且避免下標計算開銷。
| 函數 | 下標版 | 指針版 | 優勢 |
|---|---|---|---|
| strcpy | 直觀易懂 | 賦值表達式隱式判斷 | 指針版更簡潔高效 |
| strlen | 需計數器 | 指針相減得長度 | 指針版無額外變量 |
| strcmp | 邊界檢查明確 | 指針同步推進 | 指針版碼更短 |
掌握指針版本不僅能寫出更地道的 C 代碼,更能深入理解「數組退化為指針」、「賦值表達式有值」、「指針算術」等核心概念。面試與底層開發中極常考察。