題目代碼修正與分析
原代碼有語法錯誤(反引號、格式字串逗號),修正版:
#include <stdio.h>
int main() {
char c = 'a'; // 字元字面常數用單引號
int i = 65; // 整數 65
// 格式字串用雙引號,參數用逗號分隔
printf("%c.%d.%c,%d\n", c, c, i, i);
return 0;
}
執行結果
a.97.A,65
詳細解析
| 格式指定符 | 對應引數 | 輸出值 | 說明 |
%c | c ('a') | a | 以字元形式輸出,ASCII 97 顯示為 'a' |
%d | c ('a') | 97 | 以有號十進位整數輸出,字元自動提升為 int,值為 ASCII 碼 97 |
%c | i (65) | A | 以字元形式輸出,65 對應 ASCII 大寫 'A' |
%d | i (65) | 65 | 以整數輸出,值不變 |
核心知識點
1. 字元在 C 語言中本質是整數
char 佔 1 位元組,儲存 ASCII 碼(0-127)或擴展 ASCII(0-255)。
'a' 即為整數常數 97,'A' 為 65,'0' 為 48。
- 字元參與運算時自動提升為
int(整數提升)。
2. printf 格式指定符決定解讀方式
%c:將對應引數視為 unsigned char,輸出該字元。
%d / %i:將對應引數視為 int,輸出有號十進位。
- 同一變數,不同格式符,輸出完全不同——這是類型不安全的體現,需程式設計師自行保證匹配。
3. ASCII 碼對照表(關鍵範圍)
| 字元 | 十進位 | 十六進位 | 備註 |
'0' - '9' | 48 - 57 | 0x30 - 0x39 | 連續,'5' - '0' == 5 |
'A' - 'Z' | 65 - 90 | 0x41 - 0x5A | 大寫字母 |
'a' - 'z' | 97 - 122 | 0x61 - 0x7A | 小寫字母,'a' - 'A' == 32 |
' ' (空格) | 32 | 0x20 | |
\n (換行) | 10 | 0x0A | |
\0 (空字元) | 0 | 0x00 | 字串結束標記 |
4. 實用技巧:字元與數字互轉
// 字元轉對應數字
int digit = ch - '0'; // '5' -> 5
// 數字轉字元
char ch = digit + '0'; // 5 -> '5'
// 大小寫轉換 (ASCII 專用)
char lower = upper + 32; // 'A' -> 'a'
char upper = lower - 32; // 'a' -> 'A'
// 標準庫更安全:
#include <ctype.h>
char lower = tolower(upper);
char upper = toupper(lower);
常見錯誤對照
| 錯誤代碼 | 問題 | 修正 |
char c = `a`; | 反引號非字元字面常數 | char c = 'a'; |
printf("%c.%d.%c,%d\n".c.c.i.i); | 格式字串用點號、參數用點號 | printf("%c.%d.%c,%d\n", c, c, i, i); |
printf("%c", 97); 輸出 'a' | 正確,但可讀性差 | 建議 printf("%c", 'a'); |
char c = 97; printf("%d", c); | 輸出 97,正確 | 若要輸出字元用 %c |
延伸:scanf 讀取字元與整數
char ch;
int num;
scanf(" %c", &ch); // 前面空格跳過空白字元(含換行)
scanf("%d", &num); // 讀取整數
// 注意:%c 不跳過空白,需在格式字串前加空格
總結
%c 與 %d 是 C 語言格式化輸出最基礎的指定符,分別對應「字元視圖」與「整數視圖」。理解 字元本質是整數(ASCII 碼)、格式符決定解讀方式,是掌握 C 輸入輸出的關鍵。