2016-06-05 11 views
1
class Noob1 { 
    public static void main(String args[]) 
     throws java.io.IOException{ 

     char ch, answer; 
     answer = 'g'; 

     do { 
      System.out.println("Guess from A-L:"); 
      ch = (char) System.in.read(); 
       if(ch == answer){ 
        System.out.println("Congratz!"); 
      } else System.out.println("Try again!"); 
     } while (ch != answer); 
    } 
} 

Der Ausgang ist dies:Java do-while-Schleife Konsole Eingang Überspringen

Guess from A-L: 
a 
Try again! 
Guess from A-L: 
Try again! // this is where intuitively it should ask for input again 
Guess from A-L: 
Try again! 
Guess from A-L: 
g   // input is skipped a few times 
Congratz! 

ich nicht, warum herausfinden können, ich ein Buch für Anfänger und alles lesen, sollten abgedeckt habe, was ich Ich vermisse?

Das Hinzufügen des unten stehenden Codes am Ende der Schleife bestätigt, dass es geloopt wird, aber die Eingabe wird irgendwie übersprungen.

i++; 
System.out.println(i); 

Also habe ich es funktioniert dies mit:

import java.io.*; 

class Noob1 
{ 
    public static void main(String args[]) throws java.io.IOException 
    { 
     char ch, answer; 
     String tmp; 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); 
     answer = 'g'; 

      do 
      { 
       System.out.println("Guess character followed by ENTER:"); 
       tmp = bufferedReader.readLine(); 
       ch = tmp.charAt(0); // only first char is considered 
       if (ch == answer) 
        System.out.println("Gratz! the answer was: " + ch + "!"); 
       else 
        System.out.println("Nope, try again.."); 
      } while (ch != answer); 
    } 
} 

Ist die Formatierung noch schrecklich?

+0

Es empfiehlt sich, sich von Anfang an für konsistente Einrückungen und Verstrebungen zu entscheiden. Der Code in der Frage könnte eine Bereinigung verwenden. –

+0

@Tunaki: Das OP verwendet nicht 'Scanner'. Aber es kann durchaus noch eine frühere Version dieser Frage geben, die 'System.in' direkt verwendet. –

+1

@ T.J.Crowder Sie haben Recht ... albern mich. Danke, dass du darauf hingewiesen hast. Dies wäre angemessener http://StackOverflow.com/Questions/27239265/whats-wrong-with-for-loop oder http://StackOverflow.com/Questions/15296637/System-In-Read-Miss-Execution – Tunaki

Antwort

3

read liest nur ein einzelnes Zeichen, aber bei der Beantwortung, sind Sie mehr als ein Zeichen eingeben: Sie schreiben adurch eine neue Zeile gefolgt, weil Konsole Eingang nicht in den Stream gesendet wird, bis Sie drücken Eingeben. Dieser Zeilenumbruch sitzt dort im Stream und wartet darauf, von der nächsten read gelesen zu werden, weshalb er nicht darauf wartet, dass Sie etwas erneut eingeben.

Sie möchten System.in in einem BufferedReader wickeln und BufferedReader#readLine verwenden und behandeln die Tatsache, dass Sie eine Zeichenfolge anstelle eines Zeichens zu erhalten, oder alternativ nach dem Charakter bekommen, rufen Sie read wiederholt, bis Sie das Newline bekommen. Ich würde mich für bufferedReader entscheiden.

+0

Ah, das wurde irgendwo kurz erwähnt. Warum läuft es 3 mal durch? Hat ein Zeilenumbruch keinen einzigen Wert oder warum benötigt er 3 "Leerzeichen"? Wie würde ich in diesem Beispiel bufferedReader verwenden? – naike

+1

@naike: Auf einigen Betriebssystemen (wie Windows), Enter = '\ r \ n', das sind zwei Zeichen (Carriage Return [Char 13] und Newline [Char 10]). Re 'BufferedReader', schau durch den JavaDoc und probiere es aus, wobei du dir wieder bewusst bist, dass du eine Zeichenkette anstatt eines Chars bekommst. Wenn Sie nach einiger Zeit Probleme bekommen, schreiben Sie eine neue Frage mit Ihrem 'BufferedReader'-Code. –

+1

Danke, das hat einiges geklärt, ich werde es versuchen. – naike

1

Sie geben 2 Zeichen gleichzeitig ein - das Zeichen selbst und ein neues Zeilenzeichen '\ n'. Ersetzen Sie Ihre Implementierung des Lesens des Zeichens mit diesem:

charAt stellt sicher, dass nur das erste Zeichen extrahiert wird.