gets 基本語法(已棄用/移除)
char* gets(char* str);
// 從 stdin 讀取一行(含空白),遇 \n/EOF 停止,**不存儲 \n**,自動補 \0
// 危險:無緩衝區大小參數,極易溢位
標準演進
- C89/C99:標準庫函數,但**極度不安全**。
- C11 (ISO/IEC 9899:2011):**正式移除**,編譯器可能仍提供但標記棄用。
- C++11:棄用,C++14:移除。
gets vs scanf vs fgets
| 函數 | 讀取整行 | 保留 \n | 緩衝區保護 | 推薦度 |
gets | ✅ | ❌ | ❌ 無長度參數 | 🚫 禁用 |
scanf("%s") | ❌ 遇空白停 | ❌ | ⚠️ 需手動寬度 %19s | 單詞輸入可用 |
fgets(buf, n, stdin) | ✅ | ✅ 存儲 \n | ✅ 指定 n-1 上限 | ✅ **首選** |
getline (POSIX/C11) | ✅ | ✅ | ✅ 動態分配 | 現代首選 |
fgets 正確用法
#include <stdio.h>
#include <string.h>
#define MAX 100
int main() {
char buf[MAX];
printf("請輸入一行文字:");
if (fgets(buf, MAX, stdin)) {
// 移除尾部 \n(若存在)
buf[strcspn(buf, "\n")] = '\0';
printf("您輸入:%s\n", buf);
}
return 0;
}
gets 歷史範例(僅供理解舊代碼)
// 危險範例:輸入超過 79 字元即緩衝區溢位
char str1[80], str2[80];
gets(str1); // 讀整行含空白
scanf("%s", str2); // 讀單詞
// 輸入 "hello world" + Enter
// str1 = "hello world"
// str2 = "hello" (scanf 遇空白停止)
總結
gets **已被標準移除,嚴禁在新代碼使用**。
- **安全替代**:
fgets(buf, sizeof(buf), stdin) + 移除 \n。
- 現代 C (C11/POSIX):
getline(&buf, &len, stdin) 自動擴容更安全。
- C++:
std::getline(std::cin, str) 直接讀入 std::string,無長度煩惱。
- 上一篇文章: C/C++ return 語句與 main 函數回傳值規範
- 下一篇文章: C 語言 for 迴圈完整教學指南
Copyright ©
程式碼之家 All Rights Reserved