Eine sehr einfache Java-Do ... While-Schleife [Duplizieren]

8

Ich lerne JAVA und tippte das folgende DO ... WHILE Beispiel. Das Programm wird beendet, wenn ich 'q' eintippe. Es läuft, aber warum bekomme ich drei Reihen von "Bitte eine Taste gefolgt von ENTER:"?

%Vor%

    
Patrick Li 11.11.2015, 13:17
quelle

5 Antworten

10

Wenn Sie a eingeben und Enter drücken, gibt die Methode in.read() drei Zeichen zurück - 'a' , das Zeichen für Wagenrücklauf \r und das Zeichen für Zeilenumbruch ( '\n' ). (Beachten Sie, dass die Kombination \r\n unter Windows als Zeilenumbruch betrachtet wird).

Ihr Programm wird ein deutlich anderes Verhalten haben, wenn Sie es unter Linux oder OSX ausführen, da Zeilentrennzeichen für das Betriebssystem spezifisch sind, auf dem Sie das Programm ausführen. Unter Linux ist es \n , unter OS X-9 wird es zB \r sein.

Als Umgehung können Sie die gesamte Zeile lesen (indem Sie Scanner verwenden) und sie trimmen, wodurch das Zeilenumbruchzeichen (ungeachtet des Betriebssystemtyps) wegfällt:

%Vor%     
Konstantin Yovkov 11.11.2015, 13:25
quelle
5

Ich nehme an, was als Eingabe gelesen wird, enthält Ihre ENTER-Taste. Da Sie unter Windows sind, schließt dies die CRFL-Zeilenendung ein.

Sie geben also jedes Mal, wenn Sie Ihr Zeichen eingegeben haben, 3 Zeichen ein. Für Ihre erste Eingabe:

  1. ein
  2. CR
  3. LF

Versuchen Sie, eine vollständige Zeile über einen BufferedReader zu lesen, und führen Sie eine Whitespace-Trimmung darauf aus, oder bewerten Sie einfach das erste Zeichen.

    
kasoban 11.11.2015 13:25
quelle
3

Beim Eingeben von Eingaben in eine Befehlszeile auf einem Windows-System werden alle Zeilen in einem Zeilenvorschub beendet, der aus den Zeichen \r\n besteht. Wenn Sie also zum ersten Mal a eingeben, geben Sie tatsächlich a\r\n ein.

Wenn der Code System.in.read() ausgeführt wird, liest er nur das erste Zeichen, das in den Puffer eingegeben wurde, in diesem Fall a . Dann läuft die Schleife, druckt Ihre Eingabeaufforderung aus und versucht, das nächste Zeichen im Puffer zu lesen. In diesem Fall befindet sich der \r\n immer noch im Puffer und liest \r ein. Loops erneut und es liest in \n . Schließlich wird die Eingabeaufforderung ein drittes Mal gedruckt, da der Puffer leer ist und auf Ihre Eingabe wartet.

Um dies zu vermeiden, würde ich vorschlagen, eine andere Methode anstelle von System.In von der Befehlszeile einzulesen. Vielleicht wäre die Scanner -Klasse besser geeignet.

    
Evan Frisch 11.11.2015 13:25
quelle
1

Eine Sache, die Sie beachten müssen, ist, dass System.in.read() nur 1 Byte an Eingabe benötigt. Siehe hier . Wenn Sie also ein Zeichen a eingeben, ist dies bereits ein Byte, indem Sie einen zusätzlichen ENTER Schlüssel eingeben: \r und \n , der von read() two erfasst wird öfter, was zusätzliche Schleifeniteration und Drucklogik auslöst.

    
Jeff Dale 11.11.2015 13:27
quelle
0

Wie @kasoban sagte, sie sind ein, CR und LF. Es wird dreimal wiederholt, aber es wird sich je nach Betriebssystem ändern. Deshalb rate ich Ihnen, einen Scanner zu verwenden. Sie können das Beispiel unten finden

%Vor%     
Seray Uzgur 11.11.2015 13:35
quelle

Tags und Links