gets, gets_s
提供: cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev ">
</tbody><tbody>
</tbody>
| ヘッダ <stdio.h> で定義
|
||
char *gets( char *str ); |
(C11で削除) | |
char *gets_s( char *str, rsize_t n ); |
(C11以上) (オプション) |
|
1) 改行文字が見つかるかファイル終端に達するまで指定された文字列に stdin を読み込みます。 最後の文字が配列に読み込まれた直後にヌル文字が書き込まれます。 改行文字は破棄され、バッファに格納されません。
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 | - | 書き込まれる文字列 |
戻り値
成功した場合は str、失敗した場合は NULL。
失敗がファイル終端に達したことに起因する場合は、さらに stdin のファイル終端指示子 (feof() を参照) をセットします。 失敗が何らかの他のエラーに起因する場合は、 stdin のエラー指示子 (ferror() を参照) をセットします。
ノート
gets() 関数は境界チェックを行いません。 そのため、この関数はバッファオーバーフロー攻撃に対して非常に脆弱です。 (stdin に何が現れるかを制限した環境でプログラムを実行するのでない限り) この関数を安全に使用することはできません。 この理由により、この関数は C99 標準に対する3番目の正誤票で非推奨になり、 C11 標準で完全に削除されました。 fgets() および gets_s() が推奨される代用品です。
gets() は絶対に使用しないでください。
参考文献
- C11 standard (ISO/IEC 9899:2011):
- K.3.5.4.1 The gets_s function (p: 602-603)
- C99 standard (ISO/IEC 9899:1999):
- 7.19.7.7 The gets function (p: 298)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.9.7.7 The gets function
関連項目
(C11)(C11)(C11) |
stdin、ファイルストリームまたはバッファから書式付き入力を読み取ります (関数) |
| ファイルストリームから文字列を取得します (関数) | |
| ファイルストリームに文字列を書き込みます (関数) | |
(dynamic memory TR) |
ストリームから自動的にサイズ変更されるバッファにデリミタまたはファイル終端まで読み込みます (関数) |
gets の C++リファレンス
| |