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

C語言gets與scanf字符串輸入差異深度解析

     編輯:關於C語言

C語言字符串輸入:gets() 與 scanf() 核心差異詳解

字符串輸入是 C 語言基礎但易錯的知識點。本文深度對比 gets() 與 scanf() 的行為差異,並通過實例說明緩衝區處理機制。

核心差異對比表

特性scanf("%s", str)gets(str)
空格處理遇空格/Tab/換行停止可接收空格/Tab
換行符處理留在緩衝區讀取並替換為 \0
緩衝區殘留分隔符留存換行符不留存
安全性需指定寬度防溢出無長度檢查,極不安全

實例演示

// 輸入: asd fg[回車]
char ch1[10], ch2[10];
scanf("%s", ch1);  // ch1 = "asd\0"
gets(ch2);         // ch2 = "asd fg\0"

緩衝區機制深度解析

scanf 行為

  • 讀取字符直到遇空白字符
  • 自動添加 \0
  • 分隔符(空格/換行/Tab)留在 stdin 緩衝區

gets 行為

  • 讀取整行直到換行符
  • 將換行符替換為 \0
  • 換行符從緩衝區移除

混合使用陷阱

scanf("%s", ch1);  // 輸入 asdfg[回車]
c1 = getchar();    // c1 獲得殘留的 '\n'
gets(ch2);         // 立即讀取空行(遇到殘留換行符)

解決方案:scanf 後用 getchar() 吞噬殘留換行符,或統一使用 fgets()。

現代最佳實踐

棄用 gets() (C11 標準已移除),改用 fgets(str, size, stdin):

  • 指定緩衝區大小,防止溢出
  • 保留換行符需手動移除
  • 行為一致可預期

理解輸入函數的緩衝區語義,是避免 C 語言輸入處理 Bug 的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved