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

C語言實現忽略大小寫的字符串比較

     編輯:程式設計疑難解答

問題背景

標準庫函數 strcmp 區分大小寫比較字符串(基於 ASCII 碼值)。在某些業務場景下(如用戶名、不區分大小寫的關鍵字匹配),需要實現忽略字母大小寫的字符串比較:即 "Hello" 和 "hello" 應判定為相等。

輸入輸出要求

  • 輸入:兩行,每行一個字符串(長度 < 80),使用 gets 讀取(注意:gets 不安全,現代代碼建議用 fgets)。
  • 輸出:單個字符
    • <:第一個串小於第二個
    • >:第一個串大於第二個
    • =:兩串相等(忽略大小寫)

解決方案

方法一:使用標準庫 strcasecmp (POSIX) / _stricmp (Windows)

最簡單、最高效的方式是直接調用平台提供的不區分大小寫比較函數。

#include <stdio.h>
#include <string.h>
#include <strings.h> // strcasecmp 在 Linux/Unix 下需要此頭文件

int main() {
    char s1[81], s2[81];
    fgets(s1, sizeof(s1), stdin);
    fgets(s2, sizeof(s2), stdin);
    // 移除 fgets 讀取的換行符
    s1[strcspn(s1, "\n")] = '\0';
    s2[strcspn(s2, "\n")] = '\0';

    int cmp = strcasecmp(s1, s2); // Windows 用 _stricmp
    if (cmp < 0) printf("<");
    else if (cmp > 0) printf(">");
    else printf("=");
    return 0;
}

方法二:手寫實現(跨平台、無依賴)

逐字符將大寫字母轉為小寫(或統一轉大寫)後比較,直到遇到不同字符或字符串結束。

#include <stdio.h>
#include <ctype.h> // toupper / tolower

int my_stricmp(const char *s1, const char *s2) {
    while (*s1 && *s2) {
        char c1 = tolower((unsigned char)*s1);
        char c2 = tolower((unsigned char)*s2);
        if (c1 != c2) return c1 - c2;
        s1++; s2++;
    }
    // 處理長度不同但前綴相同的情況
    return tolower((unsigned char)*s1) - tolower((unsigned char)*s2);
}

int main() {
    char s1[81], s2[81];
    fgets(s1, sizeof(s1), stdin);
    fgets(s2, sizeof(s2), stdin);
    s1[strcspn(s1, "\n")] = '\0';
    s2[strcspn(s2, "\n")] = '\0';

    int res = my_stricmp(s1, s2);
    if (res < 0) putchar('<');
    else if (res > 0) putchar('>');
    else putchar('=');
    return 0;
}

關鍵點總結

  • 輸入安全:避免使用已棄用的 gets,改用 fgets 並手動去除換行符。
  • 字符轉換:使用 tolower/toupper 時需轉為 unsigned char 避免負值導致未定義行為。
  • 邊界處理:比較結束時需檢查是否因一方結束而停止,返回長度差對應的 ASCII 差值。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved