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 !

kien tran viết 21:23 ngày 30/09/2018
System.in.read();

đâ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ự CRLF , đó 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) ----->

  System.in.skip(2);

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 !

TàngThanh Phong viết 21:34 ngày 30/09/2018

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;

import java.io.*;

public class Average{
    public static void main(String[] args) throws IOException {
        int counter,grade,total,average;
        
        //khoi tao
        total=0;
        counter=1;
        
        while(counter <= 10)
        {
            System.out.println("enter de nhap diem:");
            grade = System.in.read();
            System.in.skip(2);
            if(grade=='A')
                total=total+4;
            else if(grade == 'B')
                total=total+3;
             System.in.skip(2); //bo qua dau enter newline
            counter=counter+1;
            
            
        }
          //cuoi cung
            average = total/10;
            System.out.println("trung binh la "+average);
        
    }
}
Bài liên quan
0