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

C語言字符輸入輸出函數getchar/putchar完整教學

     編輯:關於C語言

在 C 語言中,單字符的輸入輸出是最基礎的 I/O 操作。getchar() 和 putchar() 作為標準庫 <stdio.h> 中的兩個核心字符處理函數,雖然功能單一,但理解其緩衝機制、返回值語義、EOF 處理、與 scanf/printf 的關係,對掌握 C 語言 I/O 體系至關重要。本文將從函數原型、使用細節、常見陷阱、進階模式四個維度深度解析。

putchar() - 字符輸出函數

函數原型

int putchar(int c);
// 成功返回寫入的字符(作為 unsigned char 轉 int);失敗返回 EOF

基本用法

  1. putchar('A'); // 輸出字符常量
  2. putchar(x); // 輸出字符變量值
  3. putchar('\101'); // 八進制轉義:輸出 'A' (ASCII 65=101₈)
  4. putchar('\n'); // 輸出控制字符:換行

關鍵特性

  • 參數類型為 int:實際只用低 8 位(unsigned char),高位被忽略
  • 返回值可檢查錯誤:返回 EOF 表示輸出失敗(如磁盤滿、管道斷開)
  • 控制字符執行功能:\n換行、\t製表、\b退格等不顯示圖形,執行對應控制

範例:字符拼接輸出

  1. #include <stdio.h>
  2. int main(){
  3. char a='B', b='o', c='k';
  4. putchar(a); putchar(b); putchar(b); putchar(c); putchar('\t');
  5. putchar(a); putchar(b);
  6. putchar('\n');
  7. putchar(b); putchar(c);
  8. return 0;
  9. }

輸出:Book Bo\nok


getchar() - 鍵盤輸入函數

函數原型

int getchar(void);
// 成功返回讀取字符(作為 unsigned char 轉 int,範圍 0-255);EOF(-1) 表示結束/錯誤

基本用法

  1. char c;
  2. c = getchar(); // 讀取一字符賦給 c

完整範例

  1. #include <stdio.h>
  2. int main(){
  3. char c;
  4. printf("input a character\n");
  5. c = getchar();
  6. putchar(c);
  7. return 0;
  8. }

⚠️ 核心機制與常見陷阱深度解析

1. 緩衝區機制:行緩衝

getchar() 讀取的是 stdin 標準輸入流,通常為行緩衝:

  • 用戶輸入字符,存入鍵盤緩衝區
  • 按下 Enter (換行符 \n) 才將整行提交給程式
  • getchar() 從流中逐個取出字符(含 \n)

後果:程式執行到 getchar() 會阻塞,直到用戶按 Enter。

2. 返回值類型陷阱:必須用 int 接收

🚫 錯誤:用 char 接收返回值

char c = getchar();  // 危險!
if (c == EOF) ...    // EOF 通常為 -1,char 可能是有符號/無符號,比較失效

✅ 正確:用 int 接收

int c = getchar();
if (c == EOF) ...    // 安全比較
char ch = (char)c;   // 確認非 EOF 後再轉 char

3. EOF 處理與檔案結束

  • 終端輸入 EOF:Windows: Ctrl+Z,Linux/Mac: Ctrl+D
  • getchar() 返回 EOF(通常 -1)表示流結束或錯誤
  • 標準讀取循環模式:
  1. int c;
  2. while ((c = getchar()) != EOF) {
  3. putchar(c); // 複製輸入到輸出
  4. }

4. 換行符殘留問題(與 scanf 交互時)

int x; char c;
scanf("%d", &x);  // 輸入 "123\n",'\n' 留在緩衝區
c = getchar();    // 直接讀到 '\n',而非下一個字符!

解決:getchar(); 讀走殘留 \n,或用 scanf(" %c", &c) 跳過空白。

5. 只讀取第一個字符

輸入 abc + Enter,getchar() 只返回 'a',bc\n 留在緩衝區供下次讀取。

進階模式與實戰技巧

1. 字符統計:計算行數、單詞數、字符數

  1. int c, nl=0, nw=0, nc=0, in_word=0;
  2. while ((c = getchar()) != EOF) {
  3. nc++;
  4. if (c == '\n') nl++;
  5. if (c == ' ' || c == '\n' || c == '\t') in_word = 0;
  6. else if (!in_word) { in_word = 1; nw++; }
  7. }
  8. printf("行:%d 單詞:%d 字符:%d\n", nl, nw, nc);

2. 讀取整行(替代 gets 的安全版)

  1. char line[1000]; int i = 0, c;
  2. while ((c = getchar()) != EOF && c != '\n' && i < 999) {
  3. line[i++] = c;
  4. }
  5. line[i] = '\0';

3. 回聲輸入(密碼輸入隱藏需平台特定 API)

// 標準 C 無法關閉回聲,需用 termios (Linux) 或 conio.h (Windows)

4. 等價替代形式

putchar(getchar());           // 讀一字符即寫一字符
printf("%c", getchar());      // 同樣效果,但 printf 開銷大

getchar/putchar vs scanf/printf 對比

總結

getchar() 和 putchar() 是 C 語言 I/O 系統的原子操作。掌握其int 返回值語義、行緩衝特性、EOF 處理模式、緩衝區殘留交互,是理解更高層 I/O 函數(scanf、fgets、fread)的基礎。實際開發中:

  • 字符流處理、過濾、統計 → 首選 getchar/putchar
  • 結構化數據輸入 → 推薦 fgets + sscanf 組合
  • 格式化輸出 → 使用 printf 系列

記住鐵律:接收 getchar 返回值必須用 int 變量,這是避免 EOF 比較失效的唯一正確做法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度getchar/putcharscanf/printf
操作單位單字符格式化數據
格式解析無複雜格式字串
性能開銷極低較高
類型轉換無自動轉換
錯誤處理手動 (檢查 EOF)返回值檢查
適用場景字符流處理、過濾、複製、統計結構化數據輸入輸出