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

C語言輸入函數深度對比:scanf、gets、getchar 緩衝區行為與最佳實踐

     編輯:關於C語言

C語言輸入函數深度對比:scanf、gets、getchar 緩衝區行為與最佳實踐

三大輸入函數對 stdin 緩衝區的處理差異是初學者頻繁踩坑的根源。

行為對比表

函數讀取停止條件對空白字符緩衝區殘留返回值
scanf("%s", s)空白 (空格/換行/Tab)跳過前導,遇到停止並**留在緩衝區**留下後續字符含換行符成功轉換項數
gets(s)換行符 \n**讀取並丟棄**換行符,不存入無殘留 (換行已消費)字符串指針/NULL
getchar()單字符逐個讀取,含換行符逐個消費字符值/EOF
fgets(s, n, stdin)換行或 n-1 字符**保留**換行符存入無殘留字符串指針/NULL

經典坑:scanf 後接 gets

scanf("%s", a);  // 輸入 "hello\n",a="hello",緩衝區剩 "\n"
gets(b);         // 直接讀到 "\n",b="" (空串),不等待輸入!
gets(c);         // 這才真正等待用戶輸入

清空輸入緩衝區的正確姿勢

  1. 跨平台標準做法:循環 getchar() 直到 \n 或 EOF。
    #define CLEAR_BUF() do { int c; while ((c=getchar())!='\n' && c!=EOF); } while(0)
  2. Windows (MSVC):fflush(stdin) (非標準,僅 MSVC 支援)。
  3. Linux/Unix:__fpurge(stdin) 或 tcflush(0, TCIFLUSH) (需 termios.h)。
  4. 禁用緩衝:setbuf(stdin, NULL) 將 stdin 設為無緩衝 (影響性能,慎用)。

最佳實踐建議

  • **統一使用 fgets 讀整行**,再用 sscanf/strtok 解析,完全掌控緩衝區。
  • 避免 gets (C11 已移除,緩衝區溢出風險極高)。
  • scanf("%c", &ch) 前加空格 scanf(" %c", &ch) 跳過殘留空白。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved