2016-06-05 3 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); 
    } 
} 

Выход заключается в следующем:Java сделать, в то время как петля пропуск консольного ввода

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! 

Я не могу понять, почему, я читаю книгу для начинающих, так и все должно уже были рассмотрены, что же Я пропустил?

Добавление кода, приведенного ниже в конце цикла, подтверждает, что оно зацикливается, но вход каким-то образом пропускается.

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

Так что я получил это работает, используя это:

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); 
    } 
} 

ли форматирование еще страшно?

+0

Полезно иметь привычку использовать последовательные отступы и фиксации с самого начала. Код в вопросе может использовать некоторую очистку. –

+0

@Tunaki: OP не использует 'Scanner'. Но, возможно, еще будет более ранняя версия этого вопроса, используя 'System.in' напрямую. –

+1

@ T.J.Crowder Вы правы ... глупо меня. Спасибо за указание на это. Это было бы более подходящим http://stackoverflow.com/questions/27239265/whats-wrong-with-for-loop или http://stackoverflow.com/questions/15296637/system-in-read-miss-execution – Tunaki

ответ

3

read читает только один символ, но при ответе, вы печатаете больше, чем один символ: вы набираете aс последующим переводом строки, потому что вход консоль не отправляют в поток, пока не будет нажата клавиша Войти. Эта строка новой строки находится там, в потоке, ожидающем чтения следующего read, поэтому она не ждет, чтобы вы снова набрали что-то еще.

Вы можете обернуть System.in в BufferedReader и использовать BufferedReader#readLine и обрабатывать тот факт, вы получите строку вместо одного символа, или поочередно после получения вашего персонажа, вызовите read несколько раз, пока вы не получите символ новой строки. Я бы выбрал bufferedReader.

+0

А, это было вкратце упомянуто где-то. Почему это происходит через 3 раза? Не имеет ли новая строка одно значение или почему оно занимает 3 буфера «пробелы»? Как использовать bufferedReader в этом примере? – naike

+1

@naike: на некоторых ОС (например, Windows) введите = '\ r \ n', что равно двум символам (возврат каретки [char 13] и новая строка [char 10]). Re 'BufferedReader', просмотрите JavaDoc и отпустите его, снова осознавая тот факт, что вы получите строку вместо символа. Если вы столкнулись с проблемой, потратив на это некоторое время, отправьте новый вопрос с кодом 'BufferedReader'. –

+1

Спасибо, что прояснил некоторые вещи, я отдам это. – naike

1

Вы вводите сразу два символа - символ и символ новой строки \ n. Замените выполнение чтения символа следующим образом:

Scanner s= new Scanner(System.in); 
char x = s.next().charAt(0); 

charAt гарантирует извлечение только первого символа.

 Смежные вопросы

  • Нет связанных вопросов^_^