ctype.h 提供字符測試 (is...) 與大小寫轉換 (to...) 函數,參數為 int (需可表示 unsigned char 和 EOF),返回 int (非零真/零假)。本文系統整理所有函數判斷條件、ASCII 碼對應表、轉換規則、實戰代碼、避坑指南 (負值/簽名陷阱)。
is... 完整條件表| 函數 | 判斷條件 (真返回非零) | ASCII 範圍 |
|---|---|---|
| isalnum | 字母 (A-Z/a-z) 或數字 (0-9) | 0x41-0x5A, 0x61-0x7A, 0x30-0x39 |
| isalpha | 字母 (A-Z/a-z) | 0x41-0x5A, 0x61-0x7A |
| iscntrl | 控制字符 | 0x00-0x1F, 0x7F (DEL) |
| isdigit | 阿拉伯數字 (0-9) | 0x30-0x39 |
| isgraph | 可打印非空格字符 | 0x21-0x7E |
| islower | 小寫字母 (a-z) | 0x61-0x7A |
| isprint | 可打印字符 (含空格) | 0x20-0x7E |
| ispunct | 標點符號 (可打印非字母數字空格) | 0x21-0x2F, 0x3A-0x40, 0x5B-0x60, 0x7B-0x7E |
| isspace | 空白字符 | 空格(0x20), \t(0x09), \n(0x0A), \v(0x0B), \f(0x0C), \r(0x0D) |
| isupper | 大寫字母 (A-Z) | 0x41-0x5A |
| isxdigit | 十六進制數字 (0-9, A-F, a-f) | 0x30-0x39, 0x41-0x46, 0x61-0x66 |
to...| 函數 | 轉換規則 |
|---|---|
| tolower | 若為大寫字母 (A-Z),轉對應小寫 (a-z);否則原值返回。 |
| toupper | 若為小寫字母 (a-z),轉對應大寫 (A-Z);否則原值返回。 |
unsigned char 或 EOF:
char c = getchar();
// 錯誤:若 char 有符號且 c < 0,行為未定義
// 正確:
int ch = (unsigned char)c;
if (isalpha(ch)) ...
鐵律:ctype.h 函數參數永遠寫 (unsigned char)c 或存入 int 變量。setlocale(LC_CTYPE, ...) 改變字符分類結果 (如德語 ß、法語 é)。解析協議/固定格式**必須**鎖定 "C" 語言環境。isalpha 無意義。寬字符用 wctype.h (iswalpha 等)。#include <ctype.h>
#include <stdio.h>
#include <string.h>
int main(void) {
char string[] = "THIS IS A TEST";
for (size_t i = 0; i < strlen(string); i++) {
string[i] = tolower((unsigned char)string[i]); // 關鍵轉換
}
printf("%s\n", string); // 輸出: this is a test
return 0;
}
ctype.h 是字符處理的基石:**參數轉 unsigned char、注意 Locale、多字節用寬字符版**。熟記 11 個 is... 條件表、to... 規則、ASCII 碼分布,能快速編寫健壯的字符解析、驗證、轉換代碼。