gets, gets_s
來自 cppreference.com
定義於標頭檔案 <stdio.h> |
||
char* gets( char* str ); |
(1) | (C11 中移除) |
char* gets_s( char* str, rsize_t n ); |
(2) | (C11 起) |
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 函式
[編輯] 另請參閱
(C11)(C11)(C11) |
從 stdin、檔案流或緩衝區讀取格式化輸入 (函式) |
從檔案流獲取字元字串 (函式) | |
將字元字串寫入檔案流 (函式) | |
(動態記憶體 TR) |
從流中讀取到自動調整大小的緩衝區,直到分隔符/行尾 (函式) |
C++ 文件 用於 gets
|