C語言中大小寫的區分與比較方法|strcmp、tolower使用範例與常見錯誤解析

1. 前言

C 語言在程式設計時,處理字元或字串的情況下,常會遇到「大小寫區分」的問題。例如,想要判斷英文字母的使用者輸入、或是檔名、密碼的比較、條件分支等,常有人因為「沒有如預期運作」而感到困擾。 實際上,C 語言對英文字母的大小寫嚴格區分。如果未正確理解此規範,可能會導致錯誤或安全性上的失誤。 本文將從基礎開始,仔細說明「C 語言中大小寫的區分」相關內容。包括判斷方法與比較函式的使用差異、實作範例程式碼、常見錯誤以及與其他語言的差異,皆以易於初學者理解的方式整理。透過本文,正確了解大小寫的處理方式,讓您在 C 語言開發時更加安心。

2. C 語言是區分大小寫的語言

C 語言中,字母的大寫與小寫被視為完全不同的字元。這表示,程式中的變數名稱、函式名稱、保留字等所有英文字母皆遵循此規則。 例如,mainMain在同一程式中會被識別為不同的識別子。ValuevaluesumSUM亦分別被視為不同的變數或函式,因此若不小心寫錯,會導致非預期的行為或編譯錯誤。 這種大小寫的區分是基於 C 語言自誕生之初的設計理念。C 語言使用的字元編碼(主要是 ASCII 編碼)中,字母的大寫與小寫被分配為不同的數值。例如,A是 65,a是 97,同一字母的大寫與小寫在數值上完全不同。 因此,在 C 語言中,不僅變數名與函式名,連字元資料本身的比較也必須注意大小寫的差異。例如,使用 strcmp 函式比較字串時,「Hello」與「hello」會被判定為不同的字串。 如此一來,C 語言「區分大小寫」的特性對於程式的正確執行與防止錯誤都相當重要,必須加以了解。於後續章節中,將更詳細說明在意此區分的判斷與比較的具體方法。
年収訴求

3. 大寫與小寫的判定方法(單一字元情況)

C語言中想要判斷單一字元是大寫還是小寫時,有幾種簡單的方法。這裡介紹兩種常用的代表性方法。

1. 使用字元碼的範圍判定

英文字母的大寫(A~Z)與小寫(a~z)分別以連續的 ASCII 碼值定義。因此,可以使用以下條件式判斷大寫或小寫。
if ('A' <= c && c <= 'Z') {
    // c 為大寫
}
if ('a' <= c && c <= 'z') {
    // c 為小寫
}
此方法在英文字以 ASCII 碼表示時有效。大多數 C 語言環境使用此方式沒有問題,但在需要非 ASCII 編碼或多語言支援的情況下需特別注意。

2. 使用標準函式庫(ctype.h)的函式

作為更簡潔且具可讀性的方式,可使用 C 語言標準函式庫 ctype.hctype.h 提供了判斷字元類型的便利函式。
  • isupper(c) … 若 c 為大寫英文字母則回傳真(非 0)
  • islower(c) … 若 c 為小寫英文字母則回傳真
#include <stdio.h>
#include <ctype.h>

int main(void) {
    char c;
    printf("請輸入一個英文字母: ");
    scanf("%c", &c);

    if (isupper(c)) {
        printf("輸入的字元是大寫。\n");
    } else if (islower(c)) {
        printf("輸入的字元是小寫。\n");
    } else {
        printf("輸入的字元不是英文字母。\n");
    }
    return 0;
}
透過使用 isupper()islower(),即使是非英文字母的字元也能適當處理,實用性更高。 這樣一來,C 語言即可輕鬆地對每個字元判斷大寫或小寫。依需求與可讀性選擇使用方式,可防止誤判與程式錯誤的發生。下一章將詳細說明多字元(字串)的大寫與小寫比較方法。

4. 字串的大小寫比較方法

C 語言中比較由多個字元組成的字串時,會因「是否區分大小寫」而改變使用的函式或實作方式。此處將詳細說明代表性的比較方法及其差異、實務使用方式。

1. strcmp 函式的區分大小寫比較

C 語言的標準函式庫函式 strcmp 會比較兩個字串,判斷其內容是否完全相同。此函式會嚴格區分大小寫
#include <stdio.h>
#include <string.h>

int main(void) {
    char s1[100], s2[100];
    printf("請輸入第一個字串:");
    scanf("%s", s1);
    printf("請輸入第二個字串:");
    scanf("%s", s2);

    if (strcmp(s1, s2) == 0) {
        printf("兩個字串相符。
");
    } else {
        printf("兩個字串不相符。
");
    }
    return 0;
}
在此例中,「Hello」與「hello」、「ABC」與「abc」會被判定為不同的字串

2. 不區分大小寫的比較(strcasecmpstricmp

依平台而定,可使用能忽略大小寫進行比較的 strcasecmp(在 Windows 上則為 stricmp)函式。
  • strcasecmp(s1, s2) … 忽略大小寫比較
  • 在 Windows 的情況下使用 _stricmp(s1, s2)stricmp(s1, s2)
這些函式不屬於標準 C,但在許多環境中都有提供。若可使用,則可如下使用。
#include <stdio.h>
#include <strings.h> // Linux和Mac
// #include <string.h> // Windows則使用 stricmp, _stricmp

int main(void) {
    char s1[100], s2[100];
    printf("請輸入第一個字串:");
    scanf("%s", s1);
    printf("請輸入第二個字串:");
    scanf("%s", s2);

    if (strcasecmp(s1, s2) == 0) {
        printf("兩個字串(忽略大小寫)相符。
");
    } else {
        printf("兩個字串不相符。
");
    }
    return 0;
}

3. 使用 strncmpstrncasecmp 只比較前 n 個字元

若想進行部分相符判定或僅比較限定長度,可使用 strncmp(區分大小寫)或 strncasecmp(不區分大小寫)。
if (strncasecmp(s1, s2, 5) == 0) {
    // 前5個字元相符
}

4. 若無法使用時也可自行實作

如果在無法使用 strcasecmpstricmp 的環境下,可使用 tolower()toupper() 逐字元自行轉換與比較的實作方式。 如此一來,在 C 語言中是否區分大小寫會大幅影響使用的函式與判斷方式。請依需求選擇正確的函式,以防止錯誤或非預期的行為。下一章將說明大小寫的轉換方法。

5. 大小寫轉換(大寫⇔小寫的轉換)

C 語言中,常常需要將字元從大寫轉成小寫,或從小寫轉成大寫。例如,想將使用者輸入全部統一為小寫以便比較,或為了易讀性而將輸出轉為大寫等情況。以下將介紹其代表性的方法。

1. 標準函式庫的toupper()tolower()函式

C 語言標準函式庫的ctype.h中提供了將單一字元轉換為大寫或小寫的函式。
  • toupper(c) — 若 c 為小寫則返回大寫,否則原樣返回
  • tolower(c) — 若 c 為大寫則返回小寫,否則原樣返回

範例:小寫→大寫、或大寫→小寫的轉換

#include <stdio.h>
#include <ctype.h>

int main(void) {
    char c;
    printf("請輸入一個英文字母: ");
    scanf(" %c", &c);

    printf("大寫轉換: %cn", toupper(c));
    printf("小寫轉換: %cn", tolower(c));

    return 0;
}
如此一來,對每個字元的轉換非常簡單。

2. 轉換整個字串的方法

若想要轉換多字元的字串全部,則可使用迴圈逐一對每個字元呼叫 toupper()tolower()

範例:將字串全部轉為小寫

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main(void) {
    char str[100];
    printf("請輸入字串: ");
    scanf("%s", str);

    for (int i = 0; i < strlen(str); i++) {
        str[i] = tolower(str[i]);
    }
    printf("小寫轉換結果: %sn", str);

    return 0;
}
此方法對大寫的轉換亦同理。

3. 以算術運算進行轉換

雖然依賴於 ASCII 編碼,但英文字母的大寫與小寫之間相差固定的數值(32),因此可以透過以下方式進行轉換。
// 小寫→大寫
if ('a' <= c && c <= 'z') {
    c = c - ('a' - 'A');
}

// 大寫→小寫
if ('A' <= c && c <= 'Z') {
    c = c + ('a' - 'A');
}
然而,考慮到可讀性與環境相依的風險,通常建議使用 toupper()tolower()。 如此一來,C 語言的大小寫轉換非常簡單。特別是在使用者輸入、檔名、密碼驗證等不想考慮大小寫的情況下,此技巧非常有用。下一章將說明此類轉換與比較常見的錯誤與注意事項。

6. 常見錯誤與注意事項及錯誤案例

C 語言在處理大小寫的區分、比較與轉換時,稍有疏忽或誤解就可能產生錯誤或缺陷。此處彙總常見的錯誤與注意事項,以及實際的錯誤案例。

1. strcmp的使用錯誤

strcmp函式會區分大小寫進行比較。因此,「Hello」與「hello」會被判定為不相符。 若在不打算區分大小寫的情況下使用 strcmp,往往會因為行為不如預期而產生混亂。 範例:意外的不一致
if (strcmp("Hello", "hello") == 0) {
    // 條件不成立
}
在此情況下,strcmp的返回值不為 0,因而被判定為「不相符」。

2. 忘記大小寫轉換

使用者輸入或外部資料在比較時,常會忘記在比較前先進行統一大小寫的處理。例如,在密碼驗證或檔名比較時若未進行轉換,使用者可能無法如預期使用系統。 範例:比較前未進行小寫轉換的情況
if (strcmp(user_input, "password") == 0) {
    // 輸入值為 "Password" 或 "PASSWORD" 時不相符
}
→ 在比較前使用 tolower() 轉成小寫即可防止此類錯誤。

3. strcasecmpstricmp 的不支援與環境相依性

strcasecmpstricmp 並未包含於標準 C 語言。 使用時受到環境的限制。
  • Linux/UNIX 系…strcasecmp
  • Windows…stricmp_stricmp
  • 在舊環境中可能兩者皆無法使用
在此情況下,需要使用 tolower()toupper() 自行實作比較邏輯。

4. 編譯與執行時的錯誤範例

  • 忘記包含標頭檔(ctype.h, string.h
  • 函式名稱拼寫錯誤(例如:toloowertoLower 等)
  • 因陣列大小不足導致緩衝區溢位
範例:因遺漏標頭而產生的編譯錯誤
printf("%c", tolower('A'));
→ 遺漏了 #include <ctype.h>

5. 錯誤案例:大小寫差異導致的驗證失敗

案例:登入驗證時密碼無法通過
  • 系統將「Password」與「password」視為不同
  • 使用者通常不在意大小寫
  • 結果,即使輸入正確的密碼也會因為大小寫不符而無法驗證,產生問題
對策:
  • 將所有輸入值統一轉為小寫
  • 在規格中明確定義是否區分大小寫,並告知使用者
如此一來,關於大小寫處理的典型錯誤與問題,只要具備基本的理解並稍加留意,即可事先防止。下一章將以迷你專欄形式說明 C 語言與其他主要程式語言的差異。

7. 與其他語言(Python、Java 等)的差異迷你專欄

在使用 C 語言編程時,常會好奇「其他語言的大小寫處理是怎樣的?」。在此簡要說明 Python、Java 等常用的其他程式語言與 C 語言的差異。

1. 識別子(變數名、函式名)的區分

與 C 語言相同,大多數現代語言的識別子皆區分大小寫
  • C 語言 例:valueValue 為不同的東西
  • Java 完全區分大小寫。對類別名稱與方法名稱的大小寫也相當嚴格。
  • Python 同樣區分大小寫。Python 依照「PEP8」明確規範命名規則,因而建議在大小寫的使用上保持一致性。
  • JavaScript / C++ / Go 等 均區分大小寫。

2. 字串比較的差異

  • C 語言 字串比較使用 strcmp 等函式,預設區分大小寫
  • Python 可使用 == 運算子比較,但仍區分大小寫。若想進行不區分大小寫的比較,需先使用 lower()casefold() 轉換後再比較。
  if s1.lower() == s2.lower():
      # 不區分比較
  • Java equals() 方法區分大小寫,使用 equalsIgnoreCase() 可進行不區分大小寫的比較。
  • JavaScript === 運算子會區分大小寫。若不區分,則可使用 toLowerCase() 等方法統一後再比較。

3. 使用者視角的注意事項

習慣於其他語言時,常會誤以為「字串比較會自動忽略大小寫」。然而,大多數語言皆需明確區分大小寫,因此不僅在 C 語言,其他語言也需留意此點。

4. 程式碼規範與慣例的差異

例如在 Java 中,類別名稱建議以大寫開頭(PascalCase),變數名稱以小寫開頭(camelCase),命名規則亦包含大小寫的意義。C 語言的規範較為自由,但為了可讀性與避免混亂,仍建議制定一定的命名規則。 如此一來,不僅是 C 語言,許多程式語言的「大小寫區分」都是重要的要點。各語言的比較方式與命名規則略有不同,重新學習或轉換至其他語言時尤其需要留意。

8. 大寫與小寫比較彙總表

以下將截至目前為止所介紹的 C 語言大寫與小寫的判定、比較、轉換相關的代表性函式與方法,依用途整理成易於查閱的速覽表。實際編寫程式時若感到困惑,請參考此清單。

依用途 主要函式・判定方法 速覽表

用途區分有/無主要函式・方法特徵・注意點
判斷單一字元是大寫還是小寫無區分(判定)isupper(c), isl>ctype.h 中定義,僅判斷英文字母
將單一字元轉換為大寫/小寫toupper(c), tolower(c)ctype.h,非英文字母不會變化
判斷是否為英文字母isalpha(c)ctype.h,僅 A~Z/a~z
區分比較字串有區分strcmp(s1, s2)標準函式庫,使用 ASCII 碼嚴格比較
不區分比較字串無區分strcasecmp(s1, s2)非標準函式,依賴環境。可於 Linux/UNIX 系統使用
區分比較字串(n 個字元)有區分strncmp(s1, s2, n)僅比較前 n 個字元
不區分比較字串(n 個字元)無區分strncasecmp(s1, s2, n)非標準,Linux/UNIX 系
環境依賴的無區分比較(Windows)無區分stricmp(s1, s2), _stricmp(s1, s2)Windows/MSVC 系。若無法使用則自行實作
自訂比較(無區分)無區分迴圈+tolower()/toupper()先將所有字元轉換後再比較

使用範例要點

  • 比較字串時,請依「有區分/無區分」選擇使用的函式
  • strcasecmp 等非標準函式,務必確認開發環境是否支援
  • 考慮通用性與維護性時,使用 tolower()toupper() 轉換再搭配 strcmp 最為可靠
若善加利用此表,便能立即解決在編寫程式時「該使用哪個函式」或「區分會如何」等疑問。

9. 總結

到此為止,我們已廣泛說明了 C 語言中大小寫的區別,包括判定方法與比較技巧、具體範例程式碼、常見錯誤與注意事項,以及與其他語言的差異 語言中,大寫字母與小寫字母會被視為完全不同的字元。此規範不僅影響變數名與函式名,也深度關聯到字串以及單一字元的比較與判定。如果在處理時未考慮大小寫,可能會成為意外的錯誤或 bug 的原因,因此掌握正確的知識相當重要。 透過善加運用文章中介紹的 isupper()islower() 進行單一字元判定、toupper()tolower() 進行轉換、以及 strcmp()strcasecmp() 進行比較等函式,就能依情況撰寫彈性的程式。 特別是在字串比較時,依照需求選擇「區分大小寫」或「不區分大小寫」的實作是關鍵。再者,了解常見的錯誤與錯誤模式,能在實務開發現場提前防止問題發生。

常用實作模式(推薦範例)

  • 先統一輸入值的大小寫再進行比較
  • 確認環境依賴的函式是否可用,若不可用則考慮自行實作
  • 命名時也要注意大小寫規則以進行編碼
C 語言的大小寫區分是從初學者到實務工作者都必須掌握的基礎。請養成正確的知識,並將其運用於開發更穩固且錯誤更少的程式。

10. FAQ(常見問題與解答)

在此,我們彙總了關於 C 語言大小寫區分與比較的常見問題與答案。即使是小疑問也能在本節一次解決。 Q1. strcmpstrcasecmp的差異是什麼? A. strcmp嚴格區分大小寫來比較兩個字串。相對地,strcasecmp(或 Windows 的 stricmp)是一個可以不區分大小寫進行比較的便利函式。但 strcasecmpstricmp 並非標準 C 語言的函式,是否可用取決於環境。 Q2. 若無法使用 strcasecmpstricmp,該怎麼辦? A. 在此情況下,可自行實作:在迴圈中逐字元使用 tolower()toupper() 轉換後再比較。通常的做法是先將全部字串統一轉成小寫(或大寫),再以 strcmp 進行比較。 Q3. 如何簡單判斷單一字元是大寫還是小寫? A. 使用標準函式庫 ctype.h 中的 isupper()(判斷大寫)與 islower()(判斷小寫)是最簡單且推薦的做法。
if (isupper(c)) { /* 大寫 */ }
if (islower(c)) { /* 小寫 */ }
Q4. 識別子(變數名與函式名)也會區分大小寫嗎? A. 會,C 語言的識別子同樣區分大小寫。例如 sumSUM 被視為完全不同的變數。請特別留意拼寫錯誤或打字錯誤。 Q5. 能否使用 isuppertolower 來判斷或轉換日文及多位元組字元? A. 不行,isuppertolower 基本上只支援 ASCII 英文字母(A~Z、a~z),無法處理日文等多位元組字元。若需多語言或國際化支援,請使用專門的函式庫或支援 Unicode 的函式。 Q6. 比較時不想每次都在意大小寫,該怎麼辦? A. 在比較之前先將字串全部轉成小寫(或大寫)再處理,便可免除每次比較時的困擾。或者在支援 strcasecmp 等不區分大小寫的比較函式的環境下,積極使用它們。 Q7. 使用 strcmpstrcasecmp 進行比較時,全形英文字母或特殊字元會怎樣? A. 這些函式是以 ASCII 字元為前提設計的,可能無法正確處理全形英文字母、符號或其他特殊字元。若字串中混雜日文或全形英文字母,建議另行使用多位元組字串函式庫(例如 mbstowcswcsicmp 等)。 請以本 FAQ 為參考,當在實作時遇到困惑或產生疑問時,能立即找到答案。

11. 相關連結與參考資訊

在本章中,我們將彙整關於 C 語言中大寫與小寫的判定、比較、轉換的相關資訊,提供給想要進一步加深理解或尋找實務上有用資訊的讀者,推薦的連結與參考資料。請在學習或實作時加以活用。

實用的外部參考與官方文件

結語

不僅活用本文內容,結合參考資訊也能讓您在 C 語言的大寫與小寫處理上更為精通。這有助於新知識的鞏固、預防錯誤發生,以及與其他程式語言的比較,請依需求參考相關連結。
侍エンジニア塾