C言語学習ポータル(無料版) 学習コンテンツ つまずきとエラー gets を使ってしまう

🔤 文字列

gets を使ってしまう

どんなときに起きるか

gcc: warning: implicit declaration of function 'gets'(C23モードのgcc 14以降は error: implicit declaration of function 'gets')、リンク時に warning: the 'gets' function is dangerous and should not be used.。古い入門書を写経すると必ず出会います。

なぜそうなるのか

gets は読み込む長さを指定できないため、入力次第で必ずバッファをあふれさせます。危険すぎるという理由でC11で標準から削除された関数です。

直し方・再発防止

fgets(buf, sizeof buf, stdin); に置き換えます。fgets は末尾の改行も読み込むので、buf[strcspn(buf, "\n")] = '\0'; で取り除きます。古い教材のコードは、gets / strcpy / sprintf を見つけたら安全な関数に書き換える、と決めておきます。

終わりの看板(4コマ漫画)
4コマで見る「終わりの看板」

アプリでしっかり学ぶ(無料・登録不要) つまずき一覧へ

同じ場面で起きやすいつまずき

ヌル終端 '\0' を忘れる%s で表示すると、狙った文字列の後ろに文字化けが延々と続きます。strlen が想定外の大きな値を返します。運… strcpy でバッファをあふれさせる実行時に * stack smashing detected *: terminated と出て Aborted… char配列に文字列を代入できないchar s[10]; s = "hello"; で gcc: error: assignment to exp… 文字と文字列の混同('a' と "a")char c = "A"; で gcc: warning: initialization of 'char' f…

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH