2016-03-23 9 views
0

schrieb ich habe dies do-while-Schleife in einer Konsolenanwendung in C#:C# Schleife Schleifen der ersten Anweisung dreimal, bevor auf die zweite Mitteilung bewegen

do 
{ 
    ThisHelp.ShowMenu(); 
    userChoice = (char) Console.Read(); 
    ThisHelp.Helpon(userChoice); 
}while(ThisHelp.IsValid(userChoice) == false); 

Verfahren ThisHelp.ShowMenu() nur einen Haufen schreiben hat + Console.WriteLine Methoden, die den Benutzer auffordern, eine Zahl von 1 bis 8 einzugeben. Die Methode ThisHelp.Helpon() hat einen Schalter, der abhängig von der Benutzereingabe ein anderes Stück Text anzeigt. Das Verfahren ThisHelp.IsValid prüft nur, dass die Benutzereingabe eine Zahl von 1 bis 8 ist

Hier liegt das Problem: Nachdem der Benutzer eine Nummer und drückt ENTER schreibt, führt die erste Anweisung der Schleife 3-mal, bevor die zweite Anweisung ausgeführt mindestens einmal. Warum passiert dies?

edit: Hier ist der Code des ThisHelp.IsValid Methode, wie gewünscht:

public bool IsValid(char ch) 
{ 
    if (ch < '1' | ch > 8 & ch != 'q') return false; 
    else return true; 
} 
+0

Sie sollten 'verwenden int.Parse (Console.ReadLine())' statt '(char) Console.Read()' –

+0

Dont müssen Sie die Eingabe bestätigen, bevor die Ausführung der ' ThisHelp.Helpon (userChoice); 'Methode? – DCruz22

+0

@ DCruz22 Falls der Benutzer ein ungültiges Zeichen eingibt, wird mit der Methode 'ThisHelpon (userChoice);' nichts ausgedruckt, und die Ausführung springt wie beabsichtigt aus der Schleife heraus. Ich könnte es auf eine andere Weise machen, aber die Übung verlangte von mir, dass ich die Do-While-Schleife benutzte, also tat ich das. –

Antwort

5

Das Problem ist, dass Console.Read()jedes Zeichen zurückgibt, den der Benutzer eingibt. Also, wenn er 8 und tritt dann drückt ENTER erhalten Sie drei Zeichen:

  • 8
  • \r (Carriage Return) und
  • \n (neue Zeile)

Sie können eher verwenden dies:

char userChoice = Console.ReadLine().Trim()[0]; 

Aber achten Sie darauf, eine Fehlerbehandlung für leere Eingaben hinzuzufügen.

6

Console.Read() Regel nur zurück, wenn der Benutzer Return gedrückt hat - an welchem ​​Punkt der Wagenrücklauf und Zeilenvorschub wird auch sein durch nachfolgende Aufrufe an Console.Read() zurückgegeben. Sie können dies überprüfen, indem Sie den Wert userChoice bei jeder Iteration protokollieren (oder im Debugger untersuchen).

Es wäre wahrscheinlich einfacher, einfach Console.ReadLine() zu rufen, die die ganze Zeile verbrauchen wird, und dann diesen Wert in eine ganze Zahl umwandeln.

+0

Danke, das hat funktioniert. Aber ich akzeptierte die andere Antwort, weil es auch funktionierte, aber mit weniger Tastenanschlägen. Zum Beispiel müsste ich die Parameter decleration der Methoden vom Typ char in int ändern ... –

0

Sie können versuchen, die zweiten beiden Zeilen der Schleife in eins zu setzen. so etwas wie dieses versuchen:

ThisHelp.Helpon(Char.Parse(Console.Readline()));