C言語でgets関数が使えないワケや代替方法について詳しく解説

この記事では、C言語のgets関数について詳しく説明します。

gets関数は非推奨とされており、代わりに安全な関数であるgets_s関数を使用することが推奨されています。

C11規格でgets関数が廃止された理由や、gets_s関数の使い方についても解説します。

C言語のプログラミング初心者の方にもわかりやすく説明していきます。

目次から探す

gets関数とは

gets関数は、C言語で文字列を入力するために使用される関数です。

この関数は、標準入力から改行文字(‘\n’)までの文字列を受け取ります。

しかし、gets関数は非常に危険な関数であり、バッファオーバーフローの脆弱性を持っています。

そのため、C言語の最新の規格では非推奨とされています。

gets関数の概要

gets関数の概要は以下の通りです。


char* gets(char* str);

この関数は、引数として文字列を格納するためのchar型の配列(str)を受け取ります。

そして、標準入力から改行文字までの文字列を読み込んで、引数で指定された配列に格納します。

最後に、格納された文字列の先頭アドレスを返します。

しかし、gets関数は文字列の長さをチェックせずに入力を受け取るため、バッファオーバーフローの危険性があります。

そのため、C言語の最新の規格では非推奨とされており、使用することは推奨されません。

gets関数の廃止

C11規格での廃止

C言語の規格であるC11では、gets関数は正式に廃止されました。

この廃止は、バッファオーバーフローの脆弱性を持つため、セキュリティ上の問題があるとされたためです。

そのため、C11以降のバージョンでは、gets関数を使用することはできません。

代替手段

C11以降のバージョンでは、gets関数の代わりにgets_s関数が導入されました。

gets_s関数は、安全な文字列の入力を行うための関数です。

以下に、gets_s関数の概要を示します。


errno_t gets_s(char* str, rsize_t n);

この関数は、引数として文字列を格納するためのchar型の配列(str)と、配列のサイズ(n)を受け取ります。

そして、標準入力から改行文字までの文字列を最大n-1文字まで読み込んで、引数で指定された配列に格納します。

最後に、格納された文字列の先頭アドレスを返します。

gets_s関数は、バッファオーバーフローを防ぐために、配列のサイズを明示的に指定する必要があります。

また、読み込んだ文字列が配列のサイズを超える場合は、エラーが発生し、文字列は格納されません。

以下に、gets_s関数を使用したサンプルコードを示します。


#include <stdio.h>
int main() {
    char str[10];
    gets_s(str, sizeof(str));
    printf("入力された文字列: %s\n", str);
    return 0;
}

このサンプルコードでは、配列strのサイズを10として、gets_s関数を使用して文字列を入力しています。

配列のサイズを超える文字列が入力された場合、エラーが発生します。

以上が、gets関数が廃止された理由と、その代替手段であるgets_s関数についての説明です。

gets関数は非推奨とされているため、安全な文字列の入力にはgets_s関数を使用することをおすすめします。

目次から探す