最終更新日時:
が更新

履歴 編集

function
<cstdio>

std::gets(C++14で削除)

namespace std {
  char* gets(char* str); // (1) C++98
}

この関数はC++14で削除された。代わりにfgets()関数を使用すること。

概要

標準入力から1行を読み込み、指定されたバッファへ格納する。

改行文字に到達するか、終端に到達するまで文字を読み込む。読み込んだ改行文字は破棄され、バッファの末尾にはヌル文字が追加される。

事前条件

  • strは有効なポインタであること
  • strが指す領域が、入力される行を格納するのに十分な大きさであること

戻り値

成功すればstrを返す。1文字も読み込まずに終端に到達した場合、もしくは読み込みに失敗した場合はNULLを返す。

非推奨・削除の詳細

この関数は、読み込む文字数を制限する手段を持たない。そのため、入力される行がstrの指す領域より長い場合、必ずバッファオーバーフローを引き起こす。呼び出し側でこれを防ぐ方法はないため、安全に使用することが原理的にできない。

C言語では、C99の技術訂正TC3 (ISO/IEC 9899:1999/Cor.3:2007) の「Future library directions」において「gets関数は廃止予定 (obsolescent) であり、非推奨である」と規定された。続いてWG14 N1420により、C11で完全に削除された。

C++では、C++14の各国コメント (NB comment GB9) によって削除された。C++11の時点でC++が参照していたC99にはgets()が含まれていたが、C11から削除されたことを受けて、C++からも取り除かれたものである。あわせて<cstdio>の規定には「C++は関数gets()を定義しない」という注記が追加された。

この関数の代わりとして、読み込む文字数を指定できるfgets()関数を使用すること。ただしfgets()関数は改行文字を破棄せずバッファへ格納する点が異なる。

char str[10];

// std::gets(str); // 削除された。バッファオーバーフローを防げない

// 読み込む文字数を指定できる
std::fgets(str, sizeof(str), stdin);

バージョン

言語

  • C++98

関連項目

参照