手寫 strcmp 邏輯比較兩字串,輸入 and 和 and 應輸出 0,卻輸出 -43。根因是迴圈未在字串結尾 break,導致繼續比較 \0 後的記憶體亂碼。
for (i = 0; ; i++) {
if (s1[i] > s2[i]) { printf("%d", s1[i]-s2[i]); flag=0; break; }
if (s1[i] < s2[i]) { printf("%d", s1[i]-s2[i]); flag=0; break; }
if (s1[i] == s2[i] == '\0') { // ❌ 錯誤寫法
resu = 0; printf("%d", resu);
// 缺少 break!繼續執行 i++,讀取 s1[4]、s2[4]...
}
}
if (flag) { resu=0; printf("%d", resu); } // 重複輸出
s1[i] == s2[i] == '\0' 不合法:C 語言無鏈式比較,實際解析為 (s1[i] == s2[i]) == '\0',邏輯錯誤break,迴圈繼續跑,讀取陣列越界記憶體flag 機制多餘:迴圈內已處理所有情況,迴圈外 if(flag) 會重複輸出
#include
#include
int main() {
char s1[80], s2[80];
printf("Please input s1 and s2:\n");
gets(s1); // 注意:gets 不安全,教學用
gets(s2);
int i;
for (i = 0; ; i++) {
if (s1[i] != s2[i]) { // 字元不同,直接輸出差值
printf("%d", s1[i] - s2[i]);
break;
}
if (s1[i] == '\0') { // 都到達結尾,完全相等
printf("0");
break;
}
}
return 0;
}
s1[i] != s2[i],不同即輸出差值 breaks1[i] == '\0'(隱含 s2[i] == '\0'),輸出 0 break
#include
int result = strcmp(s1, s2); // 返回 <0, 0, >0
printf("%d", result);
實際專案務必用 strcmp,手寫僅供教學理解指針與字串結尾邏輯。
字串比較核心是逐字元比較直到差異或雙雙遇到 \0。缺少 break 導致越界讀取亂碼(如 -43),== 鏈式比較在 C 中無效。修正邏輯:不同→輸出差值→break,相同且\0→輸出0→break。