2017-01-04 6 views
0

IF-ELSEの部分にバグがあると思われる奇妙なサイコロゲームのプログラムを書いています。問題を再現する作業用のコードスニペットを貼り付けています。このIF-ELSEの条件には何が問題なのですか?

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int rollTotal = 11; 
    int rollTotal2 = 10; 
    char userGuess[5] = "l"; 

    if ((userGuess == "h" && rollTotal2 > rollTotal) || (userGuess == "e" && rollTotal2 == rollTotal) || (userGuess == "l" && rollTotal2 < rollTotal)) 
    { 
     printf("You win :D \n"); 
    } 
    else 
    { 
     printf("You lose D: \n"); 
    } 

    return 0; 
} 

期待される出力:「あなたが勝つ:D」|実際の出力: "あなたはDを失う:"

私はそれが条件に問題があると思った。だから、条件を(userGuess == 'h' && rollTotal2 > rollTotal)に変更しました(二重反転コンマを一つの反転コンマに変更しました)。それは私にwarning: comparison between pointer and integerと一緒に同じ出力を与えました。これは、私がそれらの機能を知らない私のために何もできなかった混乱のあるSO Q&Aに私を導く。

これは、私が上に貼り付けたプログラムである私のプログラムの現在の状態に導いてくれます(私は二重反転カンマに戻りました)。私はIF-ELSEの条件がバグであると考え続けています。それでも私はWarning: comparison with string literals results in unspecified behaviourと一緒に同じバギーの出力を与えています。これはもう一度fruitless endeavorにつながった。

このエラーは、おそらくポインタなどの知識が不足しているために発生している可能性があります。ここで私を助けてください。

IDEヘルプ - もいくつかの情報:コード::ブロック

コンパイラ:GCC

OS:Linuxの

答えて

8

userGuess == "h"(およびuserGuess == "e"

あなたは、文字列を比較しますリテラルは演算子==を使用していますが、これはC言語では有効な文字列の比較ではありません。文字列比較の標準ライブラリ関数strcmp

そうでなければ、単一char変数の代わりにcharの配列としてuserGuessを作り、それが、現状では比較のための単一の文字(単一引用符)、など

userGuess == 'h' 

を使用比較userGuess == "h"がコンパイルされますが、gcc -Wallコンパイラフラグをオンにすると警告が表示されます。たとえば、

warning: comparison with string literal results in unspecified behavior [-Waddress] 

これは、文字列自体を比較するのではなく、2つのポインタ(userGuess"l"が同じ場所を指している)を比較していることを意味します。これは有効ですが一般的に無意味です。

+0

*シングル*文字なので、*一重引用符**を使用して比較を有効にすることをお勧めします。 (例:文字列比較の代わりに文字比較にする) –

+0

@ DavidC.Rankin yeah that fair point – artm

+0

これは公正な編集です。 'userGuess == 'h''のように、 'userGuess'も文字でなければならないことを理解するために' char userGuess = '1'; ' ':)' –

0

配列userGuessのアドレスと文字列 "h"および "e"のアドレスを比較しています。これ

soltutionは、アレイの

*userGuess == 'h' 

名ポインタと同じこの配列のアドレスであり、使用されるであろう。'h'は、文字列である文字列です。

+0

なぜ単純に 'userGuess == 'h''? – RoadRunner

+0

「*」が必要な理由はわかりません。それは完璧に動作します:) –

+0

@ MythicCocoa--ここでのポイントは、あなたが 'char userGuess [5]'を持っていたので、あなたは '* userGuess == 'h''、または同等に' userGuess [ 0] == 'h' 'である。宣言を 'char userGuess'(配列ではない)に変更しない限り、' userGuess == 'h''は使用できません。 –

2

charデータ型の概念を理解してください。 1つの文字だけを比較したい場合は、変数を文字列として宣言して文字のように比較しないでください。以下のコードを見つけてください。

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
int rollTotal = 11; 
int rollTotal2 = 10; 
char userGuess = 'l'; 
if ((userGuess == 'h' && rollTotal2 > rollTotal) || (userGuess == 'e' && rollTotal2 == rollTotal) || (userGuess == 'l' && rollTotal2 < rollTotal)) 
    { 
    printf("You win :D \n"); 
} 
else 
{ 
    printf("You lose D: \n"); 
} 
getchar(); 
return 0; 
} 

あなたが代わりに文字列を比較したい場合は文字列を比較し、あなたのコード内のヘッダファイルの#includeを追加するためのstrcmp()関数を使用してください。

+0

ありがとう+1に答える –

関連する問題