| 特性 | scanf("%s") | gets() | fgets() |
|---|---|---|---|
| 頭文件 | stdio.h | stdio.h (C11 移除) | stdio.h |
| 結束條件 | 空白字元(空格/Tab/換行) | 換行或 EOF | 換行、指定長度-1 或 EOF |
| 能否讀空格 | 否 | 是 | 是 |
| 緩衝區保護 | 無(需用 %99s) | 無(極度危險) | 有(指定大小) |
| 留存換行符 | 留在緩衝區 | 丟棄,不存入 | 存入緩衝區 |
| 推薦程度 | 簡單詞讀取 | 禁用 | 首選 |
若先
scanf再gets,殘留的換行符會被gets直接讀走,導致看似「跳過輸入」。為什麼 gets() 被 C11 移除?
char buf[100];
scanf("%99s", buf); // 留 1 字節給 \0,最多讀 99 非空白字元
總結建議
- 禁用 gets(),編譯器會警告,C11 已移除。
- 互動式程式首選
fgets()+ 後處理,安全可控。scanf()適合格式化輸入(數字、單詞),讀字串必加寬度限制。- 混用時注意清理輸入緩衝區殘留換行符。