Namespaces
Variants

gets, gets_s

From cppreference.net
< c ‎ | io
ヘッダーで定義 <stdio.h>
char * gets ( char * str ) ;
(1) (C11で削除)
char * gets_s ( char * str, rsize_t n ) ;
(2) (C11以降)
1) 改行文字が見つかるか、ファイル終端が発生するまで、 stdin から str が指す文字配列に読み込む。配列に読み込まれた最後の文字の直後にnull文字が書き込まれる。改行文字は破棄され、バッファには格納されない。
2) 改行文字が見つかるか、ファイルの終端に達するまで stdin から文字を読み取る。 str が指す配列には最大 n - 1 文字のみを書き込み、常に終端のnull文字を書き込む( str がnullポインタでない限り)。見つかった改行文字は破棄され、バッファに書き込まれた文字数にはカウントされない。
以下のエラーは実行時に検出され、現在インストールされている constraint handler 関数を呼び出します:
  • n がゼロである場合;
  • n RSIZE_MAX より大きい場合;
  • str がヌルポインタである場合;
  • endline または eof が、バッファに n - 1 文字を格納した後に検出されない場合。
いずれの場合でも、 gets_s はまず stdin からの文字の読み取りを完了し、制約ハンドラを呼び出す前に改行文字、ファイル終端状態、または読み取りエラーが発生するまで文字を破棄します。
すべての境界チェック付き関数と同様に、 gets_s は、 __STDC_LIB_EXT1__ が実装によって定義され、かつユーザーが __STDC_WANT_LIB_EXT1__ を整数定数 1 に設定してから <stdio.h> をインクルードする場合にのみ利用可能であることが保証されます。

目次

パラメータ

str - stdin から配列に書き込まれる文字配列
n - str が指す配列に書き込むことができる最大文字数

戻り値

str 成功時は文字列ポインタ、失敗時はヌルポインタ。

失敗がファイル終端状態によって引き起こされた場合、追加で eof インジケータを設定します( feof() を参照)。これは stdin に対して行われます。失敗が他のエラーによって引き起こされた場合、 error インジケータを設定します( ferror() を参照)。これも stdin に対して行われます。

注記

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関数

関連項目

フォーマットされた入力を stdin 、ファイルストリーム、またはバッファから読み込む
(関数)
ファイルストリームから文字列を取得する
(関数)
文字列をファイルストリームに書き込む
(関数)
区切り文字/行末までストリームから自動的にサイズ変更されるバッファに読み込む
(関数)