2015-06-30 3 views
1

Я изучаю Java с помощью книги «Java: Руководство для начинающих». Книга показывает этот пример для цикла:Loop for, странный результат

// Loop until an S is typed 
class ForTest { 
    public static void main (String args[]) throws java.io.IOException { 

     int i; 

     System.out.println ("Press S to stop."); 

     for (i=0; (char) System.in.read() != 'S'; i++) 
       System.out.println ("Pass #" + i); 
    } 
} 

И выход:

Press S to stop. 
s 
Pass #0 
Pass #1 
Pass #2 
d 
Pass #3 
Pass #4 
Pass #5 
S 

Я не понимаю, почему он пишет три раза вдень # каждый раз, когда я нажимаю другую клавишу клавиатуры для S. Я думаю, что он должен писать Pass # только один раз. Спасибо.

+0

Не помещайте управляющие символы в поток. –

ответ

6

Вы нажали s, а затем вернулись. Этот «возврат» сгенерировал еще два символа - \r и \n (я полагаю, вы в Windows). Затем они возвращаются System.in.read().

Вот пример, который делает это более ясным:

class ForTest { 
    public static void main (String args[]) throws java.io.IOException { 

     int i; 

     System.out.println ("Press S to stop."); 
     char c; 
     for (i = 0; (c = (char) System.in.read()) != 'S'; i++) { 
      System.out.println ("Pass #" + i + "; c=" + (int) c); 
     } 
    } 
} 

Выход:

Press S to stop. 
a 
Pass #0; c=97 
Pass #1; c=13 
Pass #2; c=10 
b 
Pass #3; c=98 
Pass #4; c=13 
Pass #5; c=10 
S 

\r является Unicode символ 13 и \n 10.

+0

Большое спасибо. – Euriloco

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