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

C語言輸入函數大比拼:scanf vs gets vs fgets

     編輯:關於C

核心差異一覽

特性scanf("%s")gets()fgets()
頭文件stdio.hstdio.h (C11 移除)stdio.h
結束條件空白字元(空格/Tab/換行)換行或 EOF換行、指定長度-1 或 EOF
能否讀空格否是是
緩衝區保護無(需用 %99s)無(極度危險)有(指定大小)
留存換行符留在緩衝區丟棄,不存入存入緩衝區
推薦程度簡單詞讀取禁用首選

行為演示

若先 scanf 再 gets,殘留的換行符會被 gets 直接讀走,導致看似「跳過輸入」。

為什麼 gets() 被 C11 移除?

  • 完全不檢查緩衝區大小,輸入超長必導致棧溢位。
  • 無法區分 EOF 與讀取錯誤。
  • 歷史漏洞無數(如 Morris 蠕蟲)。

fgets() 正確使用姿勢

char buf[100];
scanf("%99s", buf);  // 留 1 字節給 \0,最多讀 99 非空白字元

進階:讀取整行含空格


總結建議

  1. 禁用 gets(),編譯器會警告,C11 已移除。
  2. 互動式程式首選 fgets() + 後處理,安全可控。
  3. scanf() 適合格式化輸入(數字、單詞),讀字串必加寬度限制。
  4. 混用時注意清理輸入緩衝區殘留換行符。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved