定義:單引號括起的單一字元,如 'a'、'9'、'!'。
儲存本質:依 ASCII 碼值以整數(short)儲存,佔 1 byte。
| 字元 | ASCII (十進位) |
|---|---|
| ! | 33 |
| 0 | 48 |
| 1 | 49 |
| 9 | 57 |
| A | 65 |
| B | 66 |
| a | 97 |
| b | 98 |
'a' - 32; // 97 - 32 = 65 ('A')
'A' + 32; // 65 + 32 = 97 ('a')
'9' - 9; // 57 - 9 = 48 ('0')
利用大小寫字母 ASCII 差值 32 可實現大小寫轉換。
關鍵區別:'9'(字元常數,ASCII 57)≠9(整數常數,值 9)。儲存方式、含義截然不同。
定義:雙引號括起的字元序列,如 "China"、"C program"、"YES&NO"。
儲存機制:記憶體中自動在末尾補 \0(NULL,ASCII 0)作為結束標誌。
佔用空間:字元數 + 1 byte。
"China" → [C][h][i][n][a][\0] // 5 字元 + 1 結束符 = 6 bytes
"A" → [A][\0] // 1 字元 + 1 結束符 = 2 bytes
'a' → [a] // 僅 1 byte
用於表示不可列印控制字元、特殊符號(單引號、雙引號、反斜線)。
形式:\ 後接字元或八/十六進位數。
| 轉義字元 | 意義 | ASCII |
|---|---|---|
| \n | 換行 | 10 |
| \t | 水平定位 | 9 |
| \v | 垂直定位 | 11 |
| \f | 換頁 | 12 |
| \r | 歸位 | 13 |
| \b | 退格 | 8 |
| \\ | 反斜線 | 92 |
| \' | 單引號 | 39 |
| \" | 雙引號 | 34 |
| \0 | 空字元 | 0 |
| \ddd | 三位八進位 ASCII | - |
| \xhh | 兩位十六進位 ASCII | - |
\v、\f 螢幕無效果,影響列印機\'、\\;字串常數中需用 \"、\\語法:#define 識別符 常量(前處理指令,以 # 開頭)
功能:編譯前以常量值替換所有識別符。
命名慣例:全大寫,區別於變數小寫。
#define PI 3.1415926
#define TRUE 1
#define FALSE 0
#define STAR '*'
優點:提高可讀性、便於修改(僅改定義處)、語意自述。
宣告:char c1, c2; — 各儲存單一字元。
指派:c1 = 'a'; c2 = 'b'; 或以 ASCII 整數指派:c1 = 97; c2 = 98;(等效)。
#include
main() {
char c1, c2;
c1 = 97; // 'a'
c2 = 98; // 'b'
c1 = c1 - 32; // 97-32=65 → 'A'
c2 = c2 - 32; // 98-32=66 → 'B'
printf("%c%c", c1, c2); // 輸出 AB
}
原理:ASCII 碼中小寫字母比大寫大 32('a' = 'A' + 32)。
| 函數 | 原型 | 功能 | 注意 |
|---|---|---|---|
| gets | char *gets(char *str) | 讀取一行(含空格)至 \n | 不檢查邊界,危險;建議用 fgets |
| puts | int puts(const char *str) | 輸出字串並自動換行 | |
| scanf | int scanf("%s", str) | 讀取單詞(遇空白結束) | 需 &str 或 str(陣列名即位址) |
| printf | int printf("%s", str) | 格式化輸出字串 | 需 \0 結束 |
strlen(str):字串長度(不含 \0)strcpy(dest, src):複製字串(含 \0)strcat(dest, src):串接字串strcmp(s1, s2):比較字串(依 ASCII)strchr(str, c)、strstr(s1, s2):搜尋字元/子字串'A' (1 byte) ≠ "A" (2 bytes) — 基本觀念必須釐清#define 符號常量為前處理文字替換,非變數,值不可變char 僅儲存單一字元,不可存字串gets/puts 處理整行,scanf/printf 處理格式化單詞