首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言手寫 strcmp:字符串比較函數實現與邊界處理

     編輯:關於C語言

C 語言手寫 strcmp:字符串比較函數實現與邊界處理

strcmp 是 C 標準庫核心函數,按字典序比較兩字符串。本文實現一個簡易版 my_strcmp,並分析常見邏輯錯誤與正確邊界處理。

一、 標準規格

  • 回傳 < 0:s1 < s2
  • 回傳 == 0:s1 == s2
  • 回傳 > 0:s1 > s2
  • 比較依據:字符 ASCII 碼值差((unsigned char)*s1 - (unsigned char)*s2)。

二、 簡易實現(教學版)

int my_strcmp(const char *s1, const char *s2) {
    assert(s1 && s2);
    while (*s1 && *s2 && *s1 == *s2) {
        s1++; s2++;
    }
    return (unsigned char)*s1 - (unsigned char)*s2;
}

邏輯:同步推進指針,直到字符不同或任一遇 \0,最後用字符差值決定大小。

三、 原文代碼問題分析

// 原文片段
while ((*str1 == *str2) && *str1 && *str2) { str1++; str2++; }
while (!(*str1 && *str2)) return 1; // 錯誤:邏輯混淆
return -1;

缺陷:

  1. 第二個 while 條件 !(*str1 && *str2) 意為「至少一個為 \0」,但直接 return 1 錯誤地將「s1 為 s2 前綴」判定為相等。
  2. 未返回字符差值,無法區分大小關係。
  3. 參數未加 const,違反只讀語義。

四、 正確邊界測試

s1s2預期說明
"abc""abc"0完全相等
"abc""abcd"<0s1 為 s2 前綴
"abd""abc">0'd' > 'c'
"""a"<0空串最小
"\200""\0">0unsigned char 比較

五、 總結

手寫 strcmp 核心就三行:同步推進 → 遇差異或結束 → 返回 unsigned char 差值。注意 const 正確性、unsigned char 轉換避免負值溢位、assert 防禦性編程。

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