20

cplusplus.comから

C 標準の最新の改訂版 (2011 年) では、この関数が仕様から完全に削除されました。

この関数は C++ では非推奨です (2011 標準以降、C99+TC3 に準拠)。

gets()C11標準の代替手段は何ですか?

4

4 に答える 4

16

C11では、次の宣言を持つものgetsに置き換えられています。gets_s

char *gets_s(char *str, rsize_t n);

この関数は、からに最大n-1charを読み取ります。これは、 に固有のバッファ オーバーフローの脆弱性を回避するためです。機能もオプションです。http://en.cppreference.com/w/c/io/getsから:stdin*strgetsfgets

gets()関数は境界チェックを実行しないため、この関数はバッファ オーバーフロー攻撃に対して非常に脆弱です。安全に使用することはできません (stdin に表示される内容を制限する環境でプログラムを実行しない限り)。このため、この関数は C99 標準の 3 番目の正誤表で非推奨になり、C11 標準では完全に削除されました。fgets()gets_s()は、推奨される代替品です。

gets()を使用しないでください。

それが標準の拡張で定義され、オプションでのみ実装されていることを考えるとgets_s、代わりに を使用してプログラムを作成する必要がありますfgets。プログラムでを使用fgetsするstdinと、以前のバージョンの C でもコンパイルされます。ただし、動作の違いに注意してください:文字gets_sを読み取った場合、改行またはファイルの終わりに到達するまで読み取り続け、入力を破棄します。そのため、入力バッファーにその一部しか返されない場合でも、常に行全体を読み取っています。n-1gets_s

于 2012-10-15T10:39:55.267 に答える
8

他の人はすでに質問に答えています。完全を期すために、これは C 標準の推奨事項です。

ISO9899:2011 K.3.5.4.1/6

推奨される実践

fgets 関数を使用すると、適切に作成されたプログラムで、長すぎて結果配列に格納できない入力行を安全に処理できます。一般に、これには、fgets の呼び出し元が結果配列内の改行文字の有無に注意を払う必要があります。gets_s の代わりに fgets を使用することを検討してください (改行文字に基づく必要な処理と一緒に)。

したがって、可能な限りfgetsを使用する必要があります。

編集

gets_s の動作は次のように指定されています。

ISO9899:2011 K.3.5.4.1/4

説明

gets_s 関数は、stdin が指すストリームから、n が指す文字数より最大で 1 つ少ない文字を、s が指す配列に読み込みます。改行文字 (破棄される) の後またはファイルの終わりの後、追加の文字は読み取られません。破棄された改行文字は、読み取られた文字数にはカウントされません。ヌル文字は、配列に読み込まれた最後の文字の直後に書き込まれます。

ファイルの終わりが検出され、文字が配列に読み取られていない場合、または操作中に読み取りエラーが発生した場合、s[0] は null 文字に設定され、s の他の要素は指定されていない値を取ります。

于 2012-10-15T13:55:24.410 に答える
6

fgetsまたはを使用できますgets_s

http://www.java2s.com/Code/C/Console/Usefgetstoreadstringfromstandardinput.htm

于 2012-10-15T10:37:40.037 に答える
4

によるとman 3 getsfgets

于 2012-10-15T10:35:51.897 に答える