11

私はC#を初めて使用し、プログラミング言語を自由に使えるようにするためにC#を学び始めましたが、CでもJavaでも遭遇しなかった小さな問題に遭遇しました。

キーボードからユーザーの応答を取得し、それを考えられるケースと比較しようとしています。これらのケースのいずれも一致しない場合は、ユーザーが正しい値を入力するまでプロセスを繰り返す必要があります。

String input = Console.ReadLine();

while ((input[0] != 'N') || (input[0] != 'Y'))
    input = Console.ReadLine();       
if (input[0] == 'N')
{
    Console.WriteLine("NO");
    Console.ReadKey();
}
else if (input[0] == 'Y')
{
    Console.WriteLine("YES");
    Console.ReadKey();
} 

これは私が試した中で最も効率的な方法ではありません。dowhileループや他の多くのバリエーションも試しました。

私が遭遇する問題は、whileループがアクティブ化されていない場合、すべてが正常に機能することですが、それを追加すると、入力がNまたはYであっても常にループに入り、明らかにループを離れることはできません。間違っています。

誰かがなぜこれが起こっているのかについて私に洞察を与えることができるか、誰かがこれを行うためのより良い方法を提案するかもしれないならば、それは大いにありがたいです。ありがとうございました。

カリム

4

5 に答える 5

11

現時点では、while ステートメントの条件は常に true になります。これをテストする良い方法は、while ループがテストされている場所にブレークポイントを置き、条件の各部分に「ウォッチを追加」することです。

変化する

while ((input[0] != 'N') || (input[0] != 'Y'))

while ((input[0] != 'N') && (input[0] != 'Y'))
于 2012-12-22T06:11:47.477 に答える
4

誰もがすでに指摘しているように、使用||すべき場所を使用しています&&

それを超えて、空の可能性のある文字列の最初の文字にもアクセスしようとしています。ユーザーが単に「Enter」を押すと、例外が発生します。

あなたはより良い方法を求めたので、とにかくキャラクターを取得することにのみ興味があるように見えるので、Console.ReadKey代わりにを使用する 1 つの代替手段を次に示します。Console.ReadLineまた、大文字と小文字を区別しないという利点もあります。

while (true)
{
    ConsoleKeyInfo key = Console.ReadKey();
    Console.WriteLine(""); // Just for nice typesetting.

    if (key.Key == ConsoleKey.N)
    {
        Console.WriteLine("NO");
        break;
    }

    if (key.Key == ConsoleKey.Y)
    {
        Console.WriteLine("YES");
        break;
    }
}
于 2012-12-22T06:28:04.240 に答える
1

問題は状態チェックにあります。

while ((input[0] != 'N') || (input[0] != 'Y'))

「 N が入力されたとします。条件(input[0] != 'Y')falseになり、while ループから抜け出す必要がありますが、|| のためです。true(input[0] != 'N')ままで、条件の最終結果がtrueになるため、ループから抜け出すことはありません。

||を置き換えます &&

于 2012-12-22T06:16:01.777 に答える
1

これを試して:-

String input = Console.ReadLine();
        while ((input[0] != 'N') && (input[0] != 'Y'))
        {
            input = Console.ReadLine();

        }
        if (input[0] == 'N')
        {
            Console.WriteLine("NO");
            Console.ReadKey();
        }
        else if (input[0] == 'Y')
        {
            Console.WriteLine("YES");
            Console.ReadKey();
        }
于 2012-12-22T06:16:36.010 に答える
0

さて、あなたの状態が問題です。2 つの条件は Ored です。つまり、条件の 1 つが true の場合、ループが実行されます。したがって、最初に Or 条件と Not the result like !(condition1 || condition2) 以下のように

        String input = Console.ReadLine();

        while (!((input[0] != 'N') || (input[0] != 'Y')))
        {
            input = Console.ReadLine();
        }

        if (input[0] == 'N')
        {
            Console.WriteLine("NO");
            Console.ReadKey();
        }

        else if (input[0] == 'Y')
        {
            Console.WriteLine("YES");
            Console.ReadKey();
        } 
于 2012-12-22T06:15:38.717 に答える