web-dev-qa-db-ja.com

Cでのユーザー入力文字の比較

次のコードスニペットは、Cプログラムからのものです。

ユーザーはYまたはNを入力します。

char *answer = '\0';

scanf (" %c", answer);

if (*answer == ('Y' || 'y'))
    // do work

このifステートメントが真と評価されない理由を理解できません。

printfを使用してyまたはn入力をチェックしましたが、そこにあるため、ユーザー入力を取得していることがわかります。また、ifステートメントの条件を1に置き換えた(trueにした)場合、適切に評価されます。

15
Joe Scho

次の2つの問題があります。

ポインターanswernullポインターであり、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') {
22
codaddict

answerはポインターであってはなりません。意図は明らかに文字を保持することです。 scanfはこの文字のアドレスを取得するため、次のように呼び出す必要があります。

char answer;
scanf(" %c", &answer);

次に、「または」ステートメントの形式が正しくありません。

if (answer == 'Y' || answer == 'y')

あなたが最初に書いたものは、answer'Y' || 'y'の結果と比較するように要求します。

9
Mark Elliot

比較がそのように機能しないためです。 _'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 */
}
_
5
hobbs