auの日記

プログラミング初心者の日記。(auはハンドルネームです)

C言語のgets関数を使う

auです。
色々なサイトを見た際にgets関数を使っているところが多かったので調べてみました。

gets関数

gets関数は標準入力を受け付ける関数です。gets関数を利用すると1行の文がそのまま格納されます。他にはscanfなどもあります。gets関数に対してscanfは空白を入力するとそれまでの行で格納されてしまうので、gets関数とは使い方が異なります。学校ではscanfしか習わなかったので、なぜgets関数を習わなかったのか不思議でしたが、あることを知ってから少しだけ納得しました。

あることとは、gets関数の場合は宣言したchar型の範囲を超えても入力ができてしまうことです。それに対し、scanfは範囲が超えた場合は表記されずに「*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)」と返されます。

#include <stdio.h>

int main(void) {
    char ch[5];
    gets(ch);
    printf("get: %s\n", ch);

    char ch2[5];
    scanf("%s", ch);
    printf("scanf: %s\n", ch);
    return 0;
}

// 実行結果
abcdefghijklmg
get: abcdefghijklmg
abcdefghijklmg
scanf: abcdefghijklmg
*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)

メモリを超えて入力をするとエラーや予期せぬ動作の原因となるため、scanfを使うほうがいいと思います。