輸入輸出是程序與外部交互的橋梁。C語言通過 scanf/printf 格式化函數及 getchar/putchar 字符函數實現 I/O,但格式控制字符串的細節往往決定程序的健壯性。
%[*][寬度][長度]類型
| 組成 | 說明 | 示例 |
|---|---|---|
| 類型 | 數據類型標識 | d(十進制整數) o(八進制) x(十六進制) u(無符號) f/e(實數) c(單字符) s(字符串) |
| * | 跳過該輸入,不賦值 | scanf("%d %*d %d", &a, &b); 輸入 1 2 3 → a=1, b=3 |
| 寬度 | 最大讀取字符數 | %5d 輸入 12345678 → 讀 12345 |
| 長度 | 數據長度修飾 | l: long/%ld, %lf; h: short/%hd |
%5.2f 非法,不能限制小數位數。scanf("%d", a) 錯誤,正確 scanf("%d", &a)。%d 讀到 A)停止。%c%c%c 無分隔符 → 輸入 d e f 實際讀到 'd',' ','e'(空格也是字符)。def,或格式串加空格 %c %c %c 允許分隔。scanf("%d,%d", &a, &b) 輸入必須為 5,6;scanf("a=%d", &a) 輸入 a=5。int a; scanf("%d", &a); printf("%ld", a); // 錯誤:%ld 期望 long,實傳 int
// 修正:long a; scanf("%ld", &a); printf("%ld", a);
輸入輸出格式符必須與變量類型嚴格對應,否則結果不可預期。
char c = getchar(); // 讀取單字符,含換行符
putchar(c); // 輸出單字符,等價 printf("%c", c)
注意:
<stdio.h>。案例 1:小寫轉大寫(利用 ASCII 碼差 32)
char a, b;
scanf("%c %c", &a, &b);
printf("%c%c\n%d%d\n", a-32, b-32, a, b);
案例 2:sizeof 統計類型字節數
int a; long b; float f; double d; char c;
printf("%d,%d,%d,%d,%d", sizeof(a),sizeof(b),sizeof(f),sizeof(d),sizeof(c));
精通格式控制字符串的每一個修飾符、理解緩衝區行緩衝特性、區分數值與字符輸入的分隔規則,是編寫健壯 C 程序、避免「輸入莫名其妙失敗」的關鍵功夫。