[解決済み】文字列リテラルとの比較の結果、不特定の動作になる?
質問
私がコーディングしようとしているプログラムには問題があります。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)
は、ヒープではなくスタックに割り当てられました。
関連
-
[解決済み】C++使用時、代入の左オペランドにlvalueが必要なエラーについて
-
[解決済み] libc++abi.dylib: NSException 型のキャッチされない例外で終了する (lldb)
-
[解決済み】C++エラー: 予想されるunqualified-idを修正する方法
-
[解決済み】ValueError: shape mismatch: オブジェクトを1つの形状にブロードキャストできない
-
[解決済み】このリポジトリで別のgitプロセスが動作しているようです。
-
[解決済み】git pullの取り消し、レポを古い状態に戻す方法
-
[解決済み】コレクションが変更され、列挙操作が実行されないことがある。
-
[解決済み】行列式で「数値/複雑な行列/ベクトルの引数が必要です」というエラーが発生?
-
[解決済み】C#コンパイラーエラー。"すべてのコードパスが値を返すわけではない"
-
[解決済み] C++の複数行の文字列リテラル
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
batスクリプトからログを出力する方法
-
CE5.2版を使って、武術のベースサイトである第一レベルのメソッドを見つける(グラフィックチュートリアル)。
-
linux シェル学習ノート 4日目
-
[解決済み】C++ -- ' の前に一次式があることが予想される。
-
[解決済み] libc++abi.dylib: NSException 型のキャッチされない例外で終了する (lldb)
-
[解決済み】recyclerview アダプタが添付されていないため、レイアウトをスキップしています。
-
[解決済み】constで変数を初期化しようとすると「initializerの要素が定数でない」というエラーが発生する。
-
[解決済み】git pullの取り消し、レポを古い状態に戻す方法
-
[解決済み] ポインタからキャストを使わずに整数を返す [-Wint-conversion] 戻り値の候補を作る
-
[解決済み】CまたはC++でのシングルクォートとダブルクォートの比較