輸入 "abcd" → 輸出 "dcba",要求 O(1) 額外空間。
char *strrev(char *s) {
char *start = s;
char *left = s;
char ch;
while (*s++) ; // 找到結束符
s -= 2; // 回退到最後一個有效字符
while (left < s) {
ch = *left;
*left++ = *s;
*s-- = ch;
}
return start;
}
while (*s++) 循環結束時 s 指向 \0 之後。s -= 2:第一次 -- 回到 \0,第二次 -- 回到最後一個字符。left < s 條件自動處理奇/偶長度,中間字符無需交換。
char * __cdecl strrev(char *string) {
char *start = string;
char *left = string;
char ch;
while (*string++);
string -= 2;
while (left < string) {
ch = *left;
*left++ = *string;
*string-- = ch;
}
return start;
}
邏輯完全一致,變量命名更規範,無多餘變量。
int main() {
char buf[200];
printf("輸入字符串:");
fgets(buf, sizeof(buf), stdin);
buf[strcspn(buf, "\n")] = 0; // 去換行
printf("逆序:%s\n", strrev(buf));
return 0;
}
strcpy 複製再反轉副本。