首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言字串比較:for 迴圈缺少 break 導致越界讀取亂碼

     編輯:程式設計綜合問答

手寫 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); } // 重複輸出

三個關鍵錯誤

  1. s1[i] == s2[i] == '\0' 不合法:C 語言無鏈式比較,實際解析為 (s1[i] == s2[i]) == '\0',邏輯錯誤
  2. 相等且為結尾時缺少 break,迴圈繼續跑,讀取陣列越界記憶體
  3. 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],不同即輸出差值 break
  • 檢查結尾:相同情況下檢查 s1[i] == '\0'(隱含 s2[i] == '\0'),輸出 0 break
  • 移除 flag:邏輯完備,無需額外標記

標準庫最佳實踐


#include 
int result = strcmp(s1, s2); // 返回 <0, 0, >0
printf("%d", result);

實際專案務必用 strcmp,手寫僅供教學理解指針與字串結尾邏輯。

總結

字串比較核心是逐字元比較直到差異或雙雙遇到 \0。缺少 break 導致越界讀取亂碼(如 -43),== 鏈式比較在 C 中無效。修正邏輯:不同→輸出差值→break,相同且\0→輸出0→break。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved