'A' = 65 (0x41) 'a' = 97 (0x61) 差值 32 (0x20) 'Z' = 90 'z' = 122 第 6 位 (0x20) 控制大小寫:0=大寫, 1=小寫
char to_lower_bit(char c) { return c | 0x20; } // 大寫→小寫
char to_upper_bit(char c) { return c & ~0x20; } // 小寫→大寫
// 原理:設定/清除第 6 位
// 注意:僅對字母有效,非字母字元會產生非預期結果
char to_lower_arith(char c) {
if (c >= 'A' && c <= 'Z') return c + 32;
return c;
}
char to_upper_arith(char c) {
if (c >= 'a' && c <= 'z') return c - 32;
return c;
}
#include// int tolower(int c); int toupper(int c); // 參數/回傳為 int(EOF 兼容),實際處理 unsigned char 轉 int // 支援地區化(locale),非 ASCII 環境下正確
#include#include int main() { int ch; puts("Enter text (Ctrl+Z/Ctrl+D to end):"); while ((ch = getchar()) != EOF) { if (islower(ch)) putchar(toupper(ch)); else if (isupper(ch)) putchar(tolower(ch)); else if (isdigit(ch)) continue; // 跳過數字 else putchar(ch); } return 0; }
| 細節 | 說明 |
|---|---|
| `getchar()` 回傳 `int` | 需用 `int ch` 接收,以便檢測 `EOF`(通常為 -1) |
| `ctype.h` 函式參數 | 要求 `unsigned char` 轉 `int` 或 `EOF`,直接傳 `char` 可能負值導致 UB |
| `continue` 效果 | 跳過 `putchar`,實現「忽略數字」 |
| 位元法 vs 庫函式 | 位元法極快但僅限 ASCII;庫函式正確處理多國語系 |
大小寫轉換核心是 **ASCII 第 6 位操作**。教學常用 `±32` 或 `|0x20`/`&~0x20` 位元技巧;實務開發**必須使用 `