1

私はプログラミングに非常に慣れておらず、この1週間ほどC++チュートリアルをフォローしています。今日、私はこれまで読んだすべての概念を確実に理解するために、助けを借りずに独自のコンソールアプリケーションを作成することにしました。アプリケーションは、最初に5つの要素の配列に入れる5つの異なる単語を要求します。次に、4つのオプションを提供するメニューが表示されます。配列の内容を印刷するか、すべての単語を再入力するか、1つの配列要素のみを編集するか、アプリを終了します。

「1つのアレイのみを編集」オプションを選択すると、アプリケーションは「1」を押してアレイを印刷するか、他のキーを押して編集を続行するかを尋ねる別のメニューを表示します。直接編集オプションは、プログラムの開始のマッシュアップバージョンにつながり、「1」オプションを使用すると、混乱が生じます:http: //i.imgur.com/3isTD.jpg。プロセスを終了するように求めるポップアップが表示されるまで、コンソールは画像のオブジェクトと同様のオブジェクトを約5秒間画面に印刷し続けます。アプリケーションが閉じた後、出力ログにこれを受け取ります:pastebin.com/KcRU56Tg

私のアプリケーションのソースコードはここにあります:http://pastebin.com/vRUddYuK。私は通常、これを自分でデバッグしようとします(そして、過去1時間半の間)が、これは私の頭をはるかに超えていると感じています。どんな助けでもありがたいです。ありがとうございました。

4

3 に答える 3

3

do { ... } while反復を行うときは、ステートメントを避ける必要があります。あなたがしたように論理エラーを作るのは簡単すぎます。

PrintInvはcoutステートメントを実行していることに注意してください。invにはn == 5インデックスの有効な要素しかないため、これはエラーです0...4

イテレーションを次のように書き直します

for(int i=0;i < 5;++i)

ロジックがより明確になり、バグが発生する可能性が低くなります。

于 2012-07-10T04:25:08.797 に答える
2

n5に等しいanをに渡しているようですPrintInv。次に、にアクセスしますinv[n]。これは、5要素配列の境界を超えるinv[5]です。残念ながら、これによってプログラムがクラッシュすることはありません。代わりに、ランダムなNULLが発生するまで、大量のメモリをダンプします。

于 2012-07-10T04:23:04.327 に答える
0

あなたの変数inは冗長です。これらの変数の1つだけが必要です。

5に等しいPrintInv関数を呼び出すと、問題が発生します。配列の出力値が配列の終わりを超えているため、ガベージ値が出力されているのがわかります。nPrintInv

印刷機能を次のように変更する必要があります。

// pass the array and the size of the array to your print function
void printInv(string inv[], int arrSize) {
   for(int i = 0; i < arrSize; ++i) { 
      cout << "Item " << (i + 1) << ": " << inv[i] << endl;
   }
}

次のような関数を呼び出します。

printInv(inv, 5);

また、変数は必要なスコープ内で宣言する必要があります。main関数の先頭ですべての変数を宣言する必要はありません。

于 2012-07-10T04:46:19.207 に答える