30/09/2018, 19:23
Trôi dữ liệu trong java
package lab1_lechinguyen;
import java.io.IOException;
public class InPutData {
public static void main(String[] args) throws IOException {
char secretChar, guessChar;
System.out.println("Nhập ký tự bí mật: ");
secretChar = (char)System.in.read();
do{
System.out.println("Đoán ký tự bí mật: ");
guessChar = (char)System.in.read();
if(guessChar == secretChar)
System.out.println("Bạn đoán chính xác!");
else
System.out.println("Bạn đoán sai rồi!");
} while(guessChar != secretChar);
}
}
Khi mình chạy chương trình này thì mình nhập dữ liệu một lần mà vòng lặp chạy hai lần, tức là có một lần không nhập mà vòng lặp vẫn chạy, mình nghĩ đây là do lần 2 thì biến sẽ nhận phím Enter trong vùng đệm nhưng mình không biết cách xử lý thế nào, mong mọi người chỉ giáo !
Bài liên quan
đây là luồng byte. Nhiệm vụ của nó là sẽ đọc các byte tiếp theo có trong luồng (input stream) method này có đặc điểm là nếu chưa có dữ liệu nhập vào thì nó sẽ block thread hiện tại (ở ví dụ này là thread main) và đợi cho tới khi nào có dữ liệu nhập vào thì mới hết block .
Vấn đề của bạn ở đây là sau khi gọi System.in.read();, nhập ký tự lần đầu tiên và ấn phím enter thì thread main đã không còn bị block nữa Nếu bạn tìm hiểu về mã ascii của dấu enter thì bạn sẽ thấy nó sẽ gồm hai ký tự lệnh (command character) là CR (13) và LF (10) ----> sau khi bạn nhập ký tự đầu tiên và nhấn phím enter thì trong bộ đệm sẽ chứa 2 ký tự này. Sau đó đến vòng lặp do while thì System.in.read(); sẽ đọc lần lượt lần lượt từng ký tự CR và LF , đó là lý do tại sao bạn lại thấy vòng lặp do while sẽ chạy 2 lần dù bạn chỉ vừa nhập ký tự đầu tiên và ấn phím enter
SOLUTION : Bạn cần loại bỏ 2 ký tự lệnh CR (13) và LF (10) ----->
bạn thêm dòng System.in.skip(2); ngay sau mỗi lần gọi System.in.read();, method skip() sẽ có nhiệm vụ bỏ 2 ký tự lệnh CR (13) và LF giúp bạn
Problem has solved !
Mình cũng bị lỗi này ,code thì trong eclip thì chạy đúng mà sang netbean thì lệnh System.in.read(2) nó không chạy đc,
Bạn có cách nào để chạy đúng trong netbean không ?
package Welcome;