• ベストアンサー

"gets"は危険なのでしょうか?

以下をコンパイルした際に"gets function is dangerous and should not be used "と警告が出ました。直訳すると"getsは危険だから使わないほうが良い"となるのですが、今私の使用している教本には"'gets'に代わる文字列入力の便利な方法は無く、入力文字数が配列を超えないように"との注意しかなく、それは厳守しています。プログラムがいけないのでしょうか。 #include <stdio.h> int main(void) { char str[80]; int i; printf("文字列を入力してください(80文字以下): "); gets(str); for(i=0; str[i]; i++) printf("%c", str[i]); return 0;

質問者が選んだベストアンサー

  • ベストアンサー
  • mi-si
  • ベストアンサー率35% (200/567)
回答No.1

gets関数はバッファオーバーフローの脆弱性の原因になる可能性があります。gets関数がバッファあふれを起こした場合の動作は予測できません。従って使用する場合注意する必要があります(特にrootなどで動かす場合はセキュリティホールの原因になります)。 一般的なのCの関数の説明でもgetsは使うべきではないと成っています。そのためにコンパイラで警告が出るようになっています。

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/gets.3.html
maxyamabiko116
質問者

お礼

早速のご回答ありがとうございました。 まだまだ初心者なので、そのような理由があったとは知りませんでした。

その他の回答 (2)

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.3

こんにちわ。 #2 のmuyoshid です。 > 'fgets'が何をする関数なのかはまだ知らないので ファイルからデータを読み込む関数です。 今回は、入力先として標準入力 (stdin) を指定しているので、 動作的にはgets(3C) のようにキーボードからの入力 を読み込んでくれます。

maxyamabiko116
質問者

お礼

再びのご回答ありがとうございました。 私も今本で'fgets'調べてみましたところ、 fgets(文字列,数値(配列の長さ),ストリーム) と書いてありました。"ストリーム???"またまた新たな単語が出て調べなければならないのですが、ご回答を読ませて頂いた限りではデータの存在する場所のようですね。 質問本題以外にも詳しく教えて頂いてありがとうございました。本当に助かりました。

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 > プログラムがいけないのでしょうか。 プログラムには問題は無いです。 > 'gets'に代わる文字列入力の便利な方法は無く 「gets(str)」の部分を「fgets(str, 80, stdin)」 に変更すれば、警告は出なくなります。 固定値 (80) の部分は、#define しておいて下さい。 但し、fgets(3C) を使用した場合、最後に改行文字 が入るので、最後の改行文字をNULL 文字に置き換える ようにしてはどうでしょう?

maxyamabiko116
質問者

お礼

早速のご回答ありがとうございました。 教えて頂いた通りソースを変更しましたところ、警告が見事に消え、プログラム自体も正常に動作しました。ただ、今C言語の勉強中で'fgets'が何をする関数なのかはまだ知らないので、これから勉強していきます。