void fanxu(char a[]) {
int i, j;
for (i = 0; a[i] != '\0'; i++); // ① 計算長度,i 停在 '\0' 處
for (j = 0; i >= 0;) // ② 邏輯錯誤:i 從 len 遞減至 0,包含 '\0'
a[j++] = a[i--]; // ③ 覆蓋原數組,導致數據丟失
a[j] = '\0';
}
i 初值為字符串長度(指向 '\0'),a[i] 讀取結束符而非最後一個有效字符。fanxu 暗示「反序輸出」,但無任何 printf/putchar。void reverse_print(const char *str) {
int len = 0;
while (str[len]) len++;
for (int i = len - 1; i >= 0; i--)
putchar(str[i]);
putchar('\n');
}
void reverse_inplace(char *str) {
char *left = str;
char *right = str + strlen(str) - 1;
while (left < right) {
char tmp = *left;
*left++ = *right;
*right-- = tmp;
}
}
void reverse_recursive(const char *str) {
if (*str) {
reverse_recursive(str + 1);
putchar(*str);
}
}
#include <stdio.h>
#include <string.h>
void reverse_print(const char *str);
void reverse_inplace(char *str);
int main() {
char buf[100];
printf("輸入字符串: ");
fgets(buf, sizeof(buf), stdin);
buf[strcspn(buf, "\n")] = '\0'; // 去換行
printf("反序輸出: ");
reverse_print(buf);
reverse_inplace(buf);
printf("就地反轉後: %s\n", buf);
return 0;
}
strlen 返回**不含** '\0' 的長度,有效索引 0 ~ len-1。"abc" 存放在只讀區,**不能**傳給就地修改函數,需用數組 char a[] = "abc";。const char * 參數承諾不修改內容,配合模式 1/3 更安全。掌握字符串反轉的三種寫法,可靈活應對面試、嵌入式受限環境、算法題不同場景需求。