| 特性 | scanf("%s", str) | gets(str) |
|---|---|---|
| 讀取終止條件 | 空白字元 (空格、換行、Tab) | 換行符 \n 或 EOF |
| 空白處理 | 跳過前導空白,遇空白停止 | 保留所有空白 (含前導/內嵌) |
| 緩衝區保護 | 可用 %99s 限制寬度 | 無任何保護,極度危險 |
| 返回值 | 成功轉換項目數 (1 或 EOF) | 字串指標 或 NULL (EOF/錯誤) |
| 標準狀態 | C89/C99/C11 標準 | C11 已移除 (C99 標記廢棄) |
#include <stdio.h>
int main() {
char buf1[20], buf2[20];
printf("輸入含空格的字串: ");
// scanf("%19s", buf1); // 只讀 "Hello"
// fgets 替代 gets
if (fgets(buf2, sizeof(buf2), stdin)) {
// 移除尾隨換行
buf2[strcspn(buf2, "\n")] = '\0';
printf("fgets 讀到: [%s]\n", buf2); // 完整讀取 "Hello World"
}
return 0;
}
// 讀取整行 (含空格),最多 19 字元
scanf("%19[^\n]", str);
// 清除輸入緩衝區殘留換行
while (getchar() != '\n');
// 跳過指定字元
scanf("%*c"); // 讀取並丟棄一字元
scanf("%*[^\n]"); // 讀取並丟棄整行
永遠不要使用 gets。現代 C 程式應統一使用 fgets 或掃描集 scanf,並嚴格檢查返回值與緩衝區邊界,這是安全程式設計的基礎底線。