2012-10-12 4 views
7

私はコードしようとしているプログラムに問題があります。これは単なる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文の名前は現在すべてプレースホルダであり、if文を追加すると、それが動作する必要のある裸の6で動作するようになります。

+0

'if(items == 0)'は意味をなさない。あなたは 'items'を動的に割り当てるのではなく、スタック変数です。その比較は決して真実ではありません。 – Praetorian

答えて

12

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

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) ... 

そして、1つの余分ノートはif (items == 0)あるitemsがスタック上ではなく、ヒープに割り当てられているので、無用です!

+0

ありがとうございます。私はコードを正常に動作させることができましたが、最後には間違った結果が出力されます。その理由を理解できません。 – user1742497

1

実際の文字列ではなく、ポインタを比較しています。 char*(または、how C strings workにチェック)の代わりにC++ stringクラスを使用してください。

5

まず、int * price;はダングリングポインタです。決して初期化しません。あなたがしなければならない。 - そう

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

第三に、あなたはあなたのケースでstrncmpを使用して文字列を比較する必要が

int * price = new int[i]; 

第二に、通常、iは、私はあなたがそれに固執示唆ので、反復子のインデックスを表し、 。

第4番目で最も重要な - 代わりにstd::stringstd::vectorを使用してください。これはC++ではなく、C++ではC.

1

ちょうど私は少しのためにつまずきました小さい事は、単一引用符と二重引用符の違いは、以下を参照してください。Single quotes vs. double quotes in C or C++

私は二重引用符ではなく単一引用符付き文字列の最初の文字を比較した

- どの上記のエラーメッセージが表示されました。

関連する問題