gets, gets_s
From cppreference.com
| ヘッダー <stdio.h> で定義 |
||
| char* gets( char* str ); |
(1) | (C11で削除) |
| char* gets_s( char* str, rsize_t n ); |
(2) | (C11 以降) |
1) stdinから改行文字が見つかるか、ファイル終端に達するまで、strが指す文字配列に読み込みます。配列に読み込まれた最後の文字の直後にヌル文字が書き込まれます。改行文字は破棄されますが、バッファには格納されません。
2) stdinから改行文字が見つかるか、ファイル終端に達するまで文字を読み込みます。strが指す配列には、最大でn - 1文字のみが書き込まれ、常に終端のヌル文字が書き込まれます(strがヌルポインタでない限り)。改行文字が見つかった場合、それは破棄され、バッファに書き込まれた文字数にはカウントされません。
以下のエラーは実行時に検出され、現在インストールされている制約ハンドラ関数を呼び出します。
- nがゼロの場合。
- nがRSIZE_MAXより大きい場合。
- strがヌルポインタの場合。
- バッファにn - 1文字を格納した後、endlineまたはeofが検出されなかった場合。
いずれの場合も、
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標準の第3訂正で非推奨となり、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) |
区切り文字または行末までストリームから読み込み、自動的にリサイズされるバッファに格納する (関数) |
| getsに関するC++ドキュメント
| |