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

C語言輸入函數三劍客:scanf、gets、getchar 差異全解析

     編輯:關於C

前言

本文延續上一篇主題,進一步引入 getchar(),完整比較三大輸入函數在緩衝區處理、白字元策略、回傳值等方面的異同,助你精準選型。

核心差異對照表

特性scanf("%s")gets() / fgets()getchar() / scanf("%c")
讀取單位以白字元分隔的「詞」整行(含空格)單一字元
前導白字元自動跳過不跳過(fgets 保留)不跳過(%c 直接讀)
結束標誌白字元(留在緩衝區)\n 或 EOF(gets 丟棄 \n,fgets 保留)無(逐字元讀取)
緩衝區殘留留下結束的白字元gets 無殘留;fgets 可能留 \n無額外殘留
安全性需指定寬度防溢位gets 極不安全;fgets 安全單字元相對安全
回傳值成功轉換項目數字串指標/NULL字元值/EOF

典型陷阱場景

1. scanf 後接 gets/getchar

scanf 留下的 \n 會被後續 gets 讀為空行,或被 getchar/%c 讀為換行字元。解法:scanf 後緊接清理巨集。

2. 連續 scanf("%c") 讀取多字元

char ch1, ch2, ch3, ch4;
scanf("%c", &ch1); // 輸入 'h' + Enter -> ch1='h', 緩衝區留 '\n'
scanf("%c", &ch2); // 直接讀到 '\n'
scanf("%c", &ch3); // 等待輸入...
scanf("%c", &ch4); // ...

若需忽略白字元讀取可見字元,請用 scanf(" %c", &ch)(注意雙引號內有空格)。

getchar() 進階用法:手寫 gets 替代品

char *my_gets(char *buf, int size) {
    int c, i = 0;
    while (i < size - 1 && (c = getchar()) != EOF && c != '\n')
        buf[i++] = c;
    buf[i] = '\0';
    return (c == EOF && i == 0) ? NULL : buf;
}

此版本可控制長度、正確處理 EOF、不保留 \n,完美替代危險的 gets。

總結選型指南

  • 格式化輸入(數值、單詞):scanf + 寬度限制 + 事後清理緩衝區。
  • 整行文字(含空格):fgets(標準、安全、保留 \n 供判斷)。
  • 逐字元處理/自定義解析:getchar 為基石,構建高層輸入函式。
  • 嚴禁:gets、fflush(stdin)、無寬度限制的 scanf("%s")。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved