2012-12-22 12 views
5

Sono nuovo di C# Ho iniziato a impararlo per ampliare i linguaggi di programmazione a mia disposizione, ma ho incontrato un piccolo problema che non ho incontrato né in C né in Java.Cercando di confrontare i caratteri in C#

Sto cercando di ottenere una risposta utente dalla tastiera e quindi confrontandola con casi probabili e se nessuno di questi casi corrisponde, voglio che l'utente debba ripetere il processo finché non ha inserito un valore corretto.

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

Questo è di gran lunga non è il modo più efficace che ho provato, ho anche provato a fare un ciclo Do While e molte altre varianti. Il problema che ho riscontrato è che quando il ciclo while non è attivato tutto funziona bene, ma quando lo aggiungo entra sempre nel ciclo anche se l'input è N o Y e non può mai lasciare il ciclo anche se è chiaro che è sbagliato.

Per favore, se qualcuno può darmi qualche idea sul perché questo si sta verificando o se qualcuno può proporre un modo migliore di farlo sarebbe molto apprezzato. Grazie.

Karim

+2

Sostituisci || con && –

+0

prova e interrompi .. – sajanyamaha

+0

Penso che dovresti fare qualcosa del tipo: While (! (input [0] == 'Y' || input [0] == 'N')) –

risposta

6

In questo momento, il condizionale nella vostra dichiarazione, mentre sarà sempre vero. Un buon modo per testare questo è mettere un punto di interruzione in cui viene testato il ciclo while, quindi "Aggiungi watch" a ciascuna parte del condizionale.

Change

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

a

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

Grazie mille , mi sento come un matto pazzo. – JahKnows

0

Bene la sua condizione è il problema. Le tue due condizioni sono Ored, cioè se una delle condizioni è vera, allora il ciclo verrà eseguito. Quindi, in primo luogo o le condizioni e non il risultato come! (Condizione1 || condizione2) come in seguito

 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

il problema è nella condizione di controllo.

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

Supponiamo 'N' viene immesso. La condizione (input[0] != 'Y') diventa false e dovrebbe uscire dal ciclo while ma a causa di || con (input[0] != 'N') che rimane true, il risultato finale in condizione risulta essere true e quindi non si interrompe mai.

Sostituire || con & &

1

Prova questa: -

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

Come tutti hanno già fatto notare, si sta utilizzando || dove si dovrebbe utilizzare &&.

Oltre a ciò, si sta tentando di accedere anche al primo carattere di una stringa che è possibile vuoto. Ciò causerà un'eccezione se l'utente preme semplicemente "Invio".

Dal momento che hai chiesto un modo migliore, ecco un'alternativa, che utilizza Console.ReadKey anziché Console.ReadLine, poiché sembra che tu sia interessato a ottenere comunque un personaggio. Ha anche il vantaggio che non è case-sensitive.

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 è un approccio migliore – exexzian

Problemi correlati