14

コーディングしようとしているプログラムに問題があります。これは単なる Windows コンソール プログラムであり、私は C++ を初めて使用します。それは私の4番目のプログラムです。

私が抱えている問題は、プログラムを実行するとエラーは発生しませんが、以下で強調表示する行に「文字列リテラルとの比較により未指定の動作が発生する」という多くの警告が表示されることです。

必要な数値を追加する代わりにプログラムを実行すると、入力に何を入力しても、ランダムな巨大な数値が得られます。

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

#include <iostream>

using namespace std;

int main()
{
     int hold;
     int i;
     int n;
     i = 6;
     int result;
     int * price;
     char items[100][100];

     if (items == 0)
        cout << "No items can be stored";
    else
    {
        for (n=0; n<i; n++)
        {
            cout << "Item#" << n << ": ";
            cin >> items[n];
        }
        cout <<  "\nYou Entered: \n";
        for (n=0; n<i; n++)
            cout << items[n] << ", ";

    }
    for (n=0; n<i; 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<i; n++)
    {
    result = result + price[n];
    }

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

どんな助けでも大歓迎です。おそらく私が間違ったことをした何か大きなことがあります。if ステートメントの名前は現在すべてプレースホルダーであり、動作するために必要な裸の 6 で動作するようになったら、さらに多くの if ステートメントを追加する予定です。

4

4 に答える 4

23

C++ では==、プリミティブ型に対してのみ内部的に実装され、配列はプリミティブ型ではないため、比較char[100]と文字列リテラルは 2 つ以上のポインターとして比較するだけでchar*あり、この 2 つのポインターが等しくなることはitems[n] == "ae"できないため、true になることはありません。これの代わりに、次のようstd::stringに文字列を保持するために使用する必要があります。

std::string items[100];
// initialize items
if( items[n] == "ae" ) ...

またはstrcmp、文字列を比較するために使用する必要がありますが、文字列がstrcmp等しい場合は 0 を返すことを忘れないでください。したがって、コードは次のようになります。

char items[100][100];
// initialize items
if( strcmp(items[n], "ae") == 0 ) ...

そして、ヒープではなくスタックに割り当てられるif (items == 0)ため、1 つの余分なメモは役に立ちません。items

于 2012-10-12T23:18:09.247 に答える
7

まず、int * price;ダングリング ポインターです。初期化することはありません。あなたがしなければなりません:

int * price = new int[i];

2 番目に、通常iはイテレータ インデックスを示すので、それに固執することをお勧めします。

for (i=0; i<n; i++) //some more refactoring needed

strncmp第三に、あなたのケースで使用して char 配列を比較する必要があります。

4 番目の最も重要な点は、代わりにstd::stringandを使用することです。std::vectorこれは C ではなく C++ です。

于 2012-10-12T22:51:42.510 に答える
3

少しつまずいたのは、一重引用符と二重引用符の違いです。次を参照してください:CまたはC ++での一重引用符と二重引用符

文字列の最初の文字を単一引用符ではなく二重引用符で比較していたため、上記のエラー メッセージが表示されました。

于 2013-08-21T07:40:23.830 に答える
1

実際の文字列ではなく、ポインターを比較しています。代わりにC++stringクラスを使用しますchar*(または、C 文字列がどのように機能するかを確認します)。

于 2012-10-12T22:51:29.950 に答える