執行 putchar(getchar()); 時,輸入 a 並按 Enter,螢幕顯示兩個 a 和兩個換行。
a Enter'a' '\n' (或 '\r\n' Windows)getchar() 從緩衝區讀取一個字元:第一次回傳 'a'putchar('a') 輸出 'a' 到標準輸出(螢幕)getchar() 讀取 '\n',putchar('\n') 輸出換行
#include
int main() {
int c;
printf("輸入字元 (Ctrl+D 結束):\n");
while ((c = getchar()) != EOF) {
printf("讀到: [%c] (ASCII: %d)\n", c, c);
}
return 0;
}
輸入字元 (Ctrl+D 結束): a 讀到: [a] (ASCII: 97) 讀到: [\n] (ASCII: 10) b 讀到: [b] (ASCII: 98) 讀到: [\n] (ASCII: 10)
int n; char c;
scanf("%d", &n); // 輸入 123\n,緩衝區留下 \n
c = getchar(); // 直接讀到 \n,非預期字元
scanf("%d", &n); getchar(); 吃掉殘留換行scanf("%d %c", &n, &c); 格式字串中空格跳過空白字元scanf(" %c", &c); %c 前加空格,跳過所有空白(含換行)
// 只處理可見字元,忽略換行
int c;
while ((c = getchar()) != EOF) {
if (c == '\n' || c == '\r') continue;
putchar(c);
}
| 平台 | 換行序列 | getchar 讀取 |
|---|---|---|
| Linux/macOS | LF (\n, 0x0A) | 單一字元 '\n' |
| Windows | CRLF (\r\n, 0x0D 0x0A) | 兩個字元 '\r' 後 '\n' |
跨平台程式應同時處理 '\n' 和 '\r'。
| 特性 | scanf/printf | getchar/putchar |
|---|---|---|
| 格式化 | 支援格式字串 (%d %f %s) | 單字元,無格式化 |
| 緩衝區 | 同標準輸入/輸出緩衝區 | 同標準輸入/輸出緩衝區 |
| 空白處理 | %d/%f 自動跳過空白;%c 不跳過 | 讀取所有字元含空白 |
| 效能 | 格式解析有開銷 | 極輕量、適合高頻字元處理 |
| 適用場景 | 結構化資料輸入輸出 | 字元流處理、過濾、轉換 |
#include
int main() {
// 關閉 stdout 緩衝,每個 putchar 立即顯示
setbuf(stdout, NULL); // 或 setvbuf(stdout, NULL, _IONBF, 0)
// 或設為行緩衝(遇 \n 刷新)
setvbuf(stdout, NULL, _IOLBF, 0);
// 標準錯誤 stderr 預設無緩衝
fprintf(stderr, "這會立即顯示\n");
return 0;
}
" %c" 跳過空白,"%d %d" 空格可分隔輸入getchar() != EOF 為標準迴圈寫法