目標:將字串 "abc" 反轉存入 ar1 並輸出 "cba"。原始碼在定位指標 p 至字串末尾時,多遞增一次導致位移錯誤。
for (; *p++ != '\0';) ; // 迴圈結束時 p 指向 '\0' 之後的下一個位址
p--; // 只退一步,實際指向 '\0',而非最後一個有效字元 'c'
需再 p-- 一次(或 p -= 2),使 p 指向最後一個有效字元:
for (; *p++ != '\0';) ;
p -= 2; // 現在 p 指向 'c'
#include <stdio.h>
#include <string.h>
int main(void) {
char ar[] = "abc";
char ar1[4] = {0};
char *p = ar;
// 移至最後一個有效字元
for (; *p++ != '\0';) ;
p -= 2;
int i = strlen(ar);
for (int j = 0; j < i; j++) {
ar1[j] = *p--;
}
puts(ar1); // 輸出 cba
return 0;
}
char *p = ar + strlen(ar) - 1; // 直接指向最後一字元
for (int j = 0; j < i; j++) ar1[j] = *p--;