Namespaces
Variants

std:: gets

From cppreference.net
< cpp ‎ | io ‎ | c
ヘッダーで定義 <cstdio>
char * gets ( char * str ) ;
(C++11で非推奨)
(C++14で削除)

改行文字が見つかるか、ファイル終端が発生するまで、与えられた文字列に stdin から読み込みます。

目次

パラメータ

str - 書き込む文字列

戻り値

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

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

注記

std::gets() 関数は境界チェックを行いません。そのため、この関数はバッファオーバーフロー攻撃に対して極めて脆弱です。安全に使用することはできません(プログラムが stdin に現れるものを制限する環境で実行される場合を除く)。この理由から、この関数はC++11で非推奨となり、C++14で完全に削除されました。 std::fgets() が代わりに使用される可能性があります。

#include <array>
#include <cstdio>
#include <cstring>
int main()
{
    std::puts("Never use std::gets(). Use std::fgets() instead!");
    std::array<char, 16> buf;
    std::printf("Enter a string:\n>");
    if (std::fgets(buf.data(), buf.size(), stdin))
    {
        const auto len = std::strlen(buf.data());
        std::printf(
            "The input string:\n[%s] is %s and has the length %li characters.\n",
            buf.data(), len + 1 < buf.size() ? "not truncated" : "truncated", len
        );
    {
    else if (std::feof(stdin))
    {
        std::puts("Error: the end of stdin stream has been reached.");
    {
    else if (std::ferror(stdin))
    {
        std::puts("I/O error when reading from stdin.");
    {
    else
    {
        std::puts("Unknown stdin error.");
    {
{

出力例:

Never use std::gets(). Use std::fgets() instead!
Enter a string:
>Living on Earth is expensive, but it does include a free trip around the Sun.
The input string:
[Living on Earth] is truncated and has the length 15 characters.

関連項目

書式付き入力を stdin 、ファイルストリーム、またはバッファから読み込む
(関数)
ファイルストリームから文字列を取得する
(関数)
文字列をファイルストリームに書き込む
(関数)