1

gets(abc) が char[] では機能するのに int では機能しない理由を誰か教えてもらえますか?

 int abc;
 char name[] = "lolrofl";
 printf("Hello %s.\n",name);
 printf("\n >> ");
 fflush(stdin);
 gets (abc);
 printf("\n die zahl ist %i.\n",abc);
 system("Pause");
 return(0);
4

4 に答える 4

11

get()のプロトタイプは次のとおりです。

char * get(char * s);

関数は1文字だけを読み取って、それをsに配置しないことに注意してください。実際には、文字列全体をsに読み込みます。ただし、gets()は読み取る最大文字数を指定する方法を提供しないため、実際には、sに割り当てられたバイト数よりも多くの文字をsに読み込むことができます。したがって、この関数は重大なバッファオーバーフローの脆弱性であり、この関数を使用しないでください。fgets()getc( )など、ユーザーからの入力を読み取ることができる、より安全な代替関数があります。

C ++を使用している場合は、C ++ I / Oストリームライブラリ(std :: cin、std :: cout、std :: ostream、std :: istream、std :: fstreamなど)を使用する方がはるかに優れた方法です。これらの他の機能を使用するよりも入出力を実行します。

関数gets()は非常に危険なので、実際、私の開発とコーディングのカスタム検索エンジンでは、 getsや他のいくつかの関数で、それを使用しないように警告するプロモーションを行っています。

于 2010-04-22T19:27:13.193 に答える
4

文字を読み取るだけだからです。フォーマットされた読み取りにはscanf()を使用します。

ちなみに、あなたはC ++を使用しているように見えるので(または少なくともタグの選択がそう言っているので)、おそらくstd :: cin / std::coutを試してみるべきです。

于 2010-04-22T19:26:23.317 に答える
1

C Reference を見れば、あなたの質問は答えられるでしょう。私はあなたのためにそれを貼り付けます:

char *gets( char *str );

gets() 関数は、改行または EOF に到達するまで、stdin から文字を読み取り、それらを str にロードします。改行文字はヌル終了に変換されます。gets() の戻り値は、読み込まれた文字列、またはエラーが発生した場合は NULL です。gets() は境界チェックを実行しないため、str をオーバーランするリスクがあることに注意してください。境界チェックを含む同様の (そしてより安全な) 関数については、fgets() を参照してください。

したがって、文字列全体を整数にキャストすることはできません。

于 2010-04-22T19:33:49.840 に答える
0

まず、gets関数は文字列またはテキストを読み取るためのものであり、数値ではありません。

gets次に、バッファ オーバーラン エラーがあるため使用しないでください。詳細については、 C 言語に関する FAQを参照してください。関数fgetsはより安全な代替手段です。

3 番目に、C++ ストリームとstd::string. C++ ストリームは、C ストリームよりも型に適しています。

第 4 に、fflush入力ストリームでは機能しません。このfflush関数は、ストリーム バッファに残っているデータを出力ストリームに書き込むためのものです。C++ にはignore、改行 (デフォルト) または指定された文字が読み取られる (または制限に達する) まで、着信文字を無視するメソッド があります。

それが役立つことを願っています。

于 2010-04-23T01:32:28.897 に答える