0

プログラムはスムーズに実行され、コンパイル時にエラーや警告は表示されず、最終結果が得られたときに、何を入力してもランダムな文字と数字が大量に表示されます.

コードは次のとおりです。

#include <iostream>
#include <string>

using namespace std;

int main()
{
     int hold;
     int n;
     int * result = new int;
     int * price = new int;
     std::string items[6];

        for (n=0; n<6; n++)
        {
            cout << "Item#" << n+1 << ": ";
            cin >> items[n];
        }
        cout <<  "\nYou Entered: ";
        for (int n=0; n<6; n++)
            cout << items[n] << ", ";

    for (n=0; n<6; n++)
    {
        if (items[n] == "ab"){
        price[n] = 2650;
        }

        else if (items[n] == "ae"){
        price[n] = 1925;
        }

        else if (items[n] == "ie"){
        price[n] = 3850;
        }

        else if (items[n] == "bt"){
        price[n] = 3000;
        }

        else if (items[n] == "pd"){
        price[n] = 2850;
        }

        else if (items[n] == "ga"){
        price[n] = 2600;
        }

    }

    for (n=0; n<6; n++)
    {
     result += price[n];
    }

    cout << "\nTotal gold for this build: " << result;
    cin >> hold;
    return 0;
}
4

5 に答える 5

3
int * price = new int;

int * result = new int;

それぞれシングルを割り当てintます。あなたはおそらく意味しnew int[6]た。

std::vectorただし、代わりに使用する必要があります。

https://stackoverflow.com/a/12868164/673730からアドバイスを受けなかったことに本当にがっかりしています。これは良い学習方法ではありません。

于 2012-10-13T15:15:15.767 に答える
1

コメントをお願いします。

  1. 新しい演算子は削除とともに使用する必要があります。
  2. 宣言した「int*result」はintへのポイントであるため、目的の結果を得るには、このポイントを逆参照する必要があります。
  3. 例外を考慮に入れる必要があります。入力文字が指定されたリストにない場合はどうなりますか?
于 2012-10-13T15:52:12.020 に答える
1

この宣言int * price = new int;では、単一の にスペースを割り当てるだけですが、 の配列としてint使用し続けます。priceint

配列を宣言するには、次を使用します。int *price = new int[5];

に関してはresult、それもへのポインターとして宣言しますintが、後でそれを : として使用しintますresult += price[n];resultポインターである必要はありません。また、変数を明示的に初期化する必要があることに注意してくださいresult。使用を開始する前にゼロに設定してください。

于 2012-10-13T15:15:28.010 に答える
0

まあ、resultですint *。この種の変数は通常new int、この特定のケースで取得する別の整数変数のアドレスを格納します。ただし、

 result += price[n];

そのアドレスを変更すると、実際に から書き込み/読み取りを行うと、セグメンテーション違反が発生します*result。これは、出力が奇妙である理由でもあります。

cout << "\nTotal gold for this build: " << result;

これは、値ではなく、結果に格納されたアドレスを出力します。整数resultを作成すると、機能するはずです。

priceも変更する必要があることに注意してください。ルシアンの回答を参照してください。

エクササイズ

  1. を使用しないようにコードを変更してくださいnew
  2. プログラムはまだ失敗する可能性があります。の初期値はresult?
  3. リストにないコードをユーザーが提供した場合はどうなりますか?
于 2012-10-13T15:17:44.763 に答える
0

行を変更します。

cout << "\nTotal gold for this build: " << result;

cout << "\nTotal gold for this build: " << *result;

Resultはポインターであるため、* 演算子を使用して逆参照する必要があります。

編集:price配列の宣言を次のように変更します

int *price = new int[6];

前の宣言は、配列ではなく変数を宣言しました

于 2012-10-13T15:18:49.580 に答える