2011-10-20 16 views
1

実行時に任意のサイズの整数のセットを入力として使用するプログラムを作成する必要があります。それらは空白で区切られます。最後に、新しい行が与えられ、入力の終了を示します。後でそれらを表示できるように、整数の配列にそれらを保存するにはどうすればいいですか?コンパイル時に入力される値の数が分からないので少し難しいと思う。実行時に値を入力して実行中に表示する

答えて

0

宿題のような音。

私が間違っている場合は私を修正し、私はあなたにヒント以上のものを提供します。

ユーザー入力によっては埋められないような、本当に大きなサイズの配列を宣言してから、scanfなどを使って '\ n'にヒットするまで整数を取得するか、 malloc呼び出しとmemcpy呼び出しの組み合わせを使用して、一度に整数で、あなたが行くにつれてメモリを割り当てます。最初の選択肢は実際の世界の問題で決して行なわれるべきではありません。あなたの教科書があなたにこのようにすると言っているにもかかわらず、私は確かにそのような習慣を主張していません。

これは、あなたが解決策は、通常2つの選択肢の一つであるC.にあります典型的な問題であるだけでK & R.

でこのような例があります。

  1. 入力を保持するのに十分な大きさの大きな配列を使用します。データが本当に大きくなる可能性がある場合、これは貧弱な選択肢となることがあります。たとえば、ビデオフレームや大きなテキストファイルをアレイに保存するときなど、悪い考えがあります。これにより、古いバージョンのWindowsでバッファオーバーラン攻撃が可能になります。しかし、これは時には、1000文字を入力しないようにユーザー(つまり、あなたのプログラムを壊そうとしていないあなたの教授)に頼ることができる、より小さな(宿題)プログラムのための良い速いハック解決策です。通常、これは悪い習慣とみなされます。私が前に述べたセキュリティ上の理由で私の第2の選択肢を考えてください。

  2. ダイナミックアレイ(つまり、malloc)を使用します。これはおそらく、あなたの教授が、学生がポインタと配列を最初に学習しているときに使用する典型的な問題のように聞こえるからです。これは素晴らしいアプローチです。終了したら、あなたの記憶を無料で呼び出すことを忘れないでください。ここでのトリッキーな部分は、あなたがまだ必要な配列のサイズを知っていなければならないということです(もちろん、コンパイル時ではありません)。

+0

「ミッションクリティカルな高セキュリティアプリケーションでその1度になるまでは、ユーザー入力で埋めることはできません」...ユーザーに神を期待するよりも安全な(r)あなたを驚かせることはありません。 @peachykeen。 – ssube

+0

私たちはミッションクリティカルなハイセキュリティなアプリケーションについて話しているわけではありません。私たちは宿題の問題について話しています。プログラマーがこれをやる時間はたくさんあります。私は何度読んだのかは分かりません:char buffer [1000]; memset(バッファ、 '\ 0'、1000);他の(よく知られた)プログラムで、前にユーザーの入力を受け取ります。 –

+1

もちろん、あなたはそうすることができます、そして、人々は持っています、そして、この場合、NASAで実行されませんが、*実践を永続させる理由は絶対にありません。実生活でそれを悪用すると、全体的なバグ(バッファオーバーラン)が発生し、その中には実際のセキュリティの影響があります。 – ssube

関連する問題