名稱空間
變體
操作

gets, gets_s

來自 cppreference.com
< c‎ | io
 
 
檔案輸入/輸出
型別和物件
        
函式
檔案訪問
(C95)
非格式化輸入/輸出
getsgets_s
(直至 C11)(C11)
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

格式化輸入
 
定義於標頭檔案 <stdio.h>
char* gets( char* str );
(1) (C11 中移除)
char* gets_s( char* str, rsize_t n );
(2) (C11 起)
1)stdin 讀取字元到 str 所指向的字元陣列中,直到遇到換行符或檔案結束。在讀取到陣列中的最後一個字元之後,立即寫入一個空字元。換行符被丟棄,但不儲存在緩衝區中。
2)stdin 讀取字元,直到遇到換行符或檔案結束。最多寫入 n - 1 個字元到 str 所指向的陣列中,並始終寫入終止空字元(除非 str 是空指標)。如果找到換行符,它將被丟棄,並且不計入寫入緩衝區的字元數。
以下錯誤在執行時被檢測到,並呼叫當前安裝的 約束處理函式
  • n 為零;
  • n 大於 RSIZE_MAX
  • str 是空指標;
  • 在儲存了 n - 1 個字元到緩衝區後,未遇到行尾檔案結束
在任何情況下,gets_s 首先完成從 stdin 讀取並丟棄字元,直到遇到換行符、檔案結束條件或讀取錯誤,然後才呼叫約束處理程式。
與所有邊界檢查函式一樣,gets_s 僅在實現定義了 __STDC_LIB_EXT1__ 且使用者在包含 <stdio.h> 之前將 __STDC_WANT_LIB_EXT1__ 定義為整數常量 1 時,才保證可用。

目錄

[編輯] 引數

str - 要從 stdin 寫入字元的字元陣列
n - 可以寫入 str 所指向的陣列的最大字元數

[編輯] 返回值

成功時返回 str,失敗時返回空指標。

如果失敗是由檔案結束條件引起的,還會設定 stdin 上的 eof 指示器(參閱 feof())。如果失敗是由其他錯誤引起的,則設定 stdin 上的 error 指示器(參閱 ferror())。

[編輯] 注意

gets() 函式不執行邊界檢查,因此該函式極易受到緩衝區溢位攻擊。它無法安全使用(除非程式執行在限制 stdin 上可以出現內容的環​​境中)。因此,該函式在 C99 標準的第三個勘誤中被廢棄,並在 C11 標準中完全移除。fgets()gets_s() 是推薦的替代品。

警告:切勿使用 gets().

[編輯] 參考

  • C23 標準 (ISO/IEC 9899:2024)
  • K.3.5.4.1 gets_s 函式 (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018)
  • K.3.5.4.1 gets_s 函式 (p: TBD)
  • C11 標準 (ISO/IEC 9899:2011)
  • K.3.5.4.1 gets_s 函式 (p: 602-603)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.19.7.7 gets 函式 (p: 298)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.9.7.7 gets 函式

[編輯] 另請參閱

stdin、檔案流或緩衝區讀取格式化輸入
(函式) [編輯]
從檔案流獲取字元字串
(函式) [編輯]
將字元字串寫入檔案流
(函式) [編輯]
從流中讀取到自動調整大小的緩衝區,直到分隔符/行尾
(函式) [編輯]
C++ 文件 用於 gets