

以下をコンパイルした際に"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;
No.1ベストアンサー
- 回答日時:
gets関数はバッファオーバーフローの脆弱性の原因になる可能性があります。
gets関数がバッファあふれを起こした場合の動作は予測できません。従って使用する場合注意する必要があります(特にrootなどで動かす場合はセキュリティホールの原因になります)。一般的なのCの関数の説明でもgetsは使うべきではないと成っています。そのためにコンパイラで警告が出るようになっています。
参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/man …
No.3
- 回答日時:
こんにちわ。
#2 のmuyoshid です。
> 'fgets'が何をする関数なのかはまだ知らないので
ファイルからデータを読み込む関数です。
今回は、入力先として標準入力 (stdin) を指定しているので、
動作的にはgets(3C) のようにキーボードからの入力
を読み込んでくれます。
再びのご回答ありがとうございました。
私も今本で'fgets'調べてみましたところ、
fgets(文字列,数値(配列の長さ),ストリーム)
と書いてありました。"ストリーム???"またまた新たな単語が出て調べなければならないのですが、ご回答を読ませて頂いた限りではデータの存在する場所のようですね。
質問本題以外にも詳しく教えて頂いてありがとうございました。本当に助かりました。
No.2
- 回答日時:
こんにちわ。
> プログラムがいけないのでしょうか。
プログラムには問題は無いです。
> 'gets'に代わる文字列入力の便利な方法は無く
「gets(str)」の部分を「fgets(str, 80, stdin)」
に変更すれば、警告は出なくなります。
固定値 (80) の部分は、#define しておいて下さい。
但し、fgets(3C) を使用した場合、最後に改行文字
が入るので、最後の改行文字をNULL 文字に置き換える
ようにしてはどうでしょう?
早速のご回答ありがとうございました。
教えて頂いた通りソースを変更しましたところ、警告が見事に消え、プログラム自体も正常に動作しました。ただ、今C言語の勉強中で'fgets'が何をする関数なのかはまだ知らないので、これから勉強していきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
java初心者です。入力されたの...
-
*をユーザーが入力した数字の数...
-
C言語でつるかめ算をするにはど...
-
正負を反転させて出力するプロ...
-
Eclipseコンソール表示を、リセ...
-
プログラミング初心者です。 Py...
-
if文で困っています。
-
UWSCで変数をキー入力
-
scanfが2回使えない・・・?;
-
Excel VBAで、Application.Inpu...
-
batプログラム上で文字列を入力...
-
scanfについて
-
scanfの入力をgets関数で読み捨...
-
C言語におけるfgetsを用いたル...
-
Userformの入力順序をタブオー...
-
if文の条件にscanf関数を使うと…?
-
cout関数を使っているのですが...
-
入力値が1以下、かつ数字以外の...
-
C言語の勉強しています。すみま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
正負を反転させて出力するプロ...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
プログラミング初心者です。 Py...
-
C言語でgetchar();が上手く使え...
-
Excel VBAで、Application.Inpu...
-
電卓の小数点
-
cout関数を使っているのですが...
-
"scanf"でエンターで改行させな...
-
小数か整数かを判定する方法
-
至急教えてください!プログラ...
-
getchar()について 教えてくだ...
-
scanf が無視されます
-
batプログラム上で文字列を入力...
-
コマンドプロンプトからのEOFの...
-
IF文で戻ることはできますか?...
-
プログラミングの問題です 「金...
おすすめ情報