2012-12-22 19 views
5

Jestem nowym C# zacząłem się go uczyć, aby rozszerzyć języki programowania do mojej dyspozycji, ale mam napotkasz mały problem, że nie spotykamy się ani C ani Java.Próba porównania znaków w języku C#

Próbuję uzyskać odpowiedź użytkownika z klawiatury, a następnie porównując ją z prawdopodobnymi przypadkami i jeśli żadna z tych spraw nie jest zgodna, chcę, aby użytkownik musiał powtarzać proces, dopóki nie wprowadzi poprawnej wartości.

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(); 
     } 

To zdecydowanie nie jest najskuteczniejszy sposób, jaki wypróbowałem, próbowałem też zrobić pętlę do wykonania i wiele innych wariantów.

Problem, który napotykam, polega na tym, że gdy pętla while nie jest włączona, wszystko działa dobrze, ale kiedy ją dodaję, zawsze wchodzi w pętlę, nawet jeśli wejście ma wartość N lub Y i nigdy nie może opuścić pętli, chociaż jasne jest, że jest źle.

Proszę jeśli ktoś może mi dać pewne wyobrażenie, dlaczego to ma miejsce lub jeśli ktoś może zaproponować lepszy sposób to byłoby bardzo mile widziane. Dziękuję Ci.

Karim

+2

Wymień || z && –

+0

spróbuj przełamać i przełączyć .. – sajanyamaha

+0

Myślę, że powinieneś robić coś jak: While (! (input [0] == 'Y' || input [0] == 'N')) –

Odpowiedz

6

Teraz warunkowego w instrukcji while zawsze będzie prawdą. Dobrym sposobem na przetestowanie tego jest umieszczenie punktu przerwania, w którym testowana jest pętla while, a następnie "Dodaj zegarek" do każdej części warunkowej.

Zmień

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

do

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

Dziękuję bardzo , czuję się jak taki głupi lol. – JahKnows

0

Dobrze Twój stan jest problem. Twoje dwa warunki są Ored, co oznacza, że ​​jeśli jeden z warunków jest prawdziwy, to pętla zostanie wykonana. Więc pierwszy lub warunków, a nie wynik jak! (Warunek1 || warunek2) jak w poniżej

 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(); 
     } 
1

problem jest w sprawdzaniu stanu.

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

Załóżmy 'N' jest wprowadzony. Teraz warunek (input[0] != 'Y') zmienia się na false i powinien wyjść z pętli while, ale z powodu || z (input[0] != 'N'), który pozostaje true, wynik końcowy w stanie wyjdzie na true, a zatem nigdy nie zostanie przerwany z pętli.

Wymień || z & &

1

Spróbuj tego: -

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(); 
     } 
3

Jak każdy już zauważył, używasz || gdzie należy używać &&.

Poza tym, próbujesz także uzyskać dostęp do pierwszego znaku łańcucha, który jest pusty. Spowoduje to wyjątek, jeśli użytkownik po prostu kliknie "Enter".

Od czasu, gdy poprosiłeś o lepszy sposób, oto jedna alternatywa, która używa Console.ReadKey zamiast, ponieważ wydajesz się być zainteresowana zdobyciem postaci. Ma także tę zaletę, że nie rozróżnia wielkości liter.

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; 
    } 
} 
+0

+1 ConcoleKey to lepsze podejście – exexzian