次のコードスニペットは、Cプログラムからのものです。
ユーザーはYまたはNを入力します。
char *answer = '\0';
scanf (" %c", answer);
if (*answer == ('Y' || 'y'))
// do work
このif
ステートメントが真と評価されない理由を理解できません。
printf
を使用してyまたはn入力をチェックしましたが、そこにあるため、ユーザー入力を取得していることがわかります。また、ifステートメントの条件を1に置き換えた(trueにした)場合、適切に評価されます。
次の2つの問題があります。
ポインターanswer
はnull
ポインターであり、scanf
で間接参照しようとしています。これは未定義の動作につながります。
ここにはchar
ポインターは必要ありません。 char
変数を次のように使用できます。
char answer;
scanf(" %c",&answer);
次に、読み取った文字が'y'
または'Y'
やったほうがいい:
if( answer == 'y' || answer == 'Y') {
// user entered y or Y.
}
本当に charポインターを使用する必要がある場合は、次のようなことができます。
char var;
char *answer = &var; // make answer point to char variable var.
scanf (" %c", answer);
if( *answer == 'y' || *answer == 'Y') {
answer
はポインターであってはなりません。意図は明らかに文字を保持することです。 scanf
はこの文字のアドレスを取得するため、次のように呼び出す必要があります。
char answer;
scanf(" %c", &answer);
次に、「または」ステートメントの形式が正しくありません。
if (answer == 'Y' || answer == 'y')
あなたが最初に書いたものは、answer
を'Y' || 'y'
の結果と比較するように要求します。
比較がそのように機能しないためです。 _'Y' || 'y'
_は論理OR演算子です。引数のいずれかがtrueの場合、_1
_(true)を返します。 _'Y'
_と_'y'
_は両方とも真であるため、_*answer
_と1を比較しています。
必要なのはif(*answer == 'Y' || *answer == 'y')
またはおそらく:
_switch (*answer) {
case 'Y':
case 'y':
/* Code for Y */
break;
default:
/* Code for anything else */
}
_