1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み】文字列リテラルとの比較の結果、不特定の動作になる?

2022-01-16 17:51:46

質問

私がコーディングしようとしているプログラムには問題があります。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文をもっとたくさん追加するつもりです。

どのように解決するのですか?

C++の場合 comparison with string literal results in unspecified behaviour はプリミティブ型に対してのみ内部実装されており、配列はプリミティブ型ではありません。 == と文字列リテラルを比較した場合、2つの文字列としてしか比較されません。 char[100] あるいは2つのポインタと言った方がよいでしょう。この2つのポインタは等しくなることができないので char* は決して真にならないので、この代わりに items[n] == "ae" として文字列を保持します。

std::string

を使用する必要があります。 std::string items[100]; // initialize items if( items[n] == "ae" ) ... は文字列を比較するために使用されますが strcmp は同じ文字列の場合は0を返すので、以下のようなコードになります。

strcmp

そして、ひとつおまけは char items[100][100]; // initialize items if( strcmp(items[n], "ae") == 0 ) ... は無意味です。 if (items == 0) は、ヒープではなくスタックに割り当てられました。