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

C 語言 gets 函數用法與安全替代方案

     編輯:C 語言入門

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

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,無長度煩惱。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
函數讀取整行保留 \n緩衝區保護推薦度
gets✅❌❌ 無長度參數🚫 禁用
scanf("%s")❌ 遇空白停❌⚠️ 需手動寬度 %19s單詞輸入可用
fgets(buf, n, stdin)✅✅ 存儲 \n✅ 指定 n-1 上限✅ **首選**
getline (POSIX/C11)✅✅✅ 動態分配現代首選