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);
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や他のいくつかの関数で、それを使用しないように警告するプロモーションを行っています。
文字を読み取るだけだからです。フォーマットされた読み取りにはscanf()を使用します。
ちなみに、あなたはC ++を使用しているように見えるので(または少なくともタグの選択がそう言っているので)、おそらくstd :: cin / std::coutを試してみるべきです。
C Reference を見れば、あなたの質問は答えられるでしょう。私はあなたのためにそれを貼り付けます:
char *gets( char *str );
gets() 関数は、改行または EOF に到達するまで、stdin から文字を読み取り、それらを str にロードします。改行文字はヌル終了に変換されます。gets() の戻り値は、読み込まれた文字列、またはエラーが発生した場合は NULL です。gets() は境界チェックを実行しないため、str をオーバーランするリスクがあることに注意してください。境界チェックを含む同様の (そしてより安全な) 関数については、fgets() を参照してください。
したがって、文字列全体を整数にキャストすることはできません。
まず、gets
関数は文字列またはテキストを読み取るためのものであり、数値ではありません。
gets
次に、バッファ オーバーラン エラーがあるため使用しないでください。詳細については、 C 言語に関する FAQを参照してください。関数fgets
はより安全な代替手段です。
3 番目に、C++ ストリームとstd::string
. C++ ストリームは、C ストリームよりも型に適しています。
第 4 に、fflush
入力ストリームでは機能しません。このfflush
関数は、ストリーム バッファに残っているデータを出力ストリームに書き込むためのものです。C++ にはignore
、改行 (デフォルト) または指定された文字が読み取られる (または制限に達する) まで、着信文字を無視するメソッド があります。
それが役立つことを願っています。