首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言輸入輸出機制詳解:getchar/putchar 與緩衝區、換行符處理

     編輯:C 語言問答

核心現象

執行 putchar(getchar()); 時,輸入 a 並按 Enter,螢幕顯示兩個 a 和兩個換行。

機制解析

標準輸入緩衝區運作

  1. 使用者鍵盤輸入 a Enter
  2. 終端機驅動程式將字元放入 標準輸入緩衝區:'a' '\n' (或 '\r\n' Windows)
  3. getchar() 從緩衝區讀取一個字元:第一次回傳 'a'
  4. putchar('a') 輸出 'a' 到標準輸出(螢幕)
  5. 若在迴圈中:第二次 getchar() 讀取 '\n',putchar('\n') 輸出換行

關鍵點:getchar 讀取包含換行符


#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)

常見問題與解決方案

問題 1:scanf 後殘留換行符干擾 getchar


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 前加空格,跳過所有空白(含換行)

問題 2:getchar 迴圈處理換行符


// 只處理可見字元,忽略換行
int c;
while ((c = getchar()) != EOF) {
    if (c == '\n' || c == '\r') continue;
    putchar(c);
}

問題 3:Windows CRLF vs Unix LF

平台換行序列getchar 讀取
Linux/macOSLF (\n, 0x0A)單一字元 '\n'
WindowsCRLF (\r\n, 0x0D 0x0A)兩個字元 '\r' 後 '\n'

跨平台程式應同時處理 '\n' 和 '\r'。

scanf vs getchar/putchar 對比

特性scanf/printfgetchar/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;
}

學習重點總結

  • getchar 讀取所有字元:包含字母、數字、空格、Tab、換行、控制字元
  • 標準輸入預設行緩衝:按 Enter 後程式才能讀取
  • scanf 留下換行符:後續 getchar/%c 需額外處理
  • 格式字串空格技巧:" %c" 跳過空白,"%d %d" 空格可分隔輸入
  • EOF 條件:Linux Ctrl+D、Windows Ctrl+Z,getchar() != EOF 為標準迴圈寫法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved