2014-10-13 3 views
-1

Я хочу, чтобы строка "Enter character: " была напечатана, затем возьмите входной символ и назначьте его, а затем сохраните повторную настройку до тех пор, пока не будет введен вход - или ?. Тем не менее, "Enter character: " печатается несколько раз после первого ввода после его первоначальной печати. Ввод '?' или '-' также не выходит из цикла.Почему линия печатается несколько раз?

Вот метод:

private void runPrompt() { 
    Deque<Character> first = new Deque<Character>(); 
    Deque<Character> second = new Deque<Character>(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(
      System.in)); 
    char userChar = 0; 
    int firstWord = 0; 
    int secondWord = 0; 
    boolean isMinus = false; 
    while (!isMinus) { 
     System.out.print("Enter character: "); 
     try { 
      userChar = (char) reader.read(); 
      System.out.println(userChar); 
      first.enqueue(userChar); 
      firstWord++; 
      if (userChar == '-') { 
       isMinus = true; 
      } 
     } catch (QueueException e) { 
      System.out.println(e.toString()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    if (isMinus) { 
     while (userChar != '?') { 
      System.out.print("Enter character: "); 
      try { 
       userChar = (char) reader.read(); 
       System.out.println(userChar); 
       second.enqueue(userChar); 
       secondWord++; 
      } catch (QueueException e) { 
       System.out.println(e.toString()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    switch (checkLength(firstWord, secondWord, isMinus)) { 
    case 0: 
     System.out.print("\t>>Same length, "); 
     if (checkContent(first, second)) { 
      System.out.print("Same content, "); 
      if (checkPalindrome(first, firstWord)) { 
       System.out.println("Palindrome"); 
      } 
     } else { 
      System.out.println("Different content, no Palindrome"); 
     } 
     break; 

    case 1: 
     System.out 
       .println("\t>>Left longer, different content, no Palindrome"); 
     break; 

    case 2: 
     System.out 
       .println("\t>>Right longer, different content, no Palindrome"); 
     break; 

    case 3: 
     System.out.println("\t>>No minus"); 

    default: 
     break; 
    } 
} 

Вот как пример вывода:

Enter character: r 
    r 
    Enter character: 

    Enter character: 

    Enter character: 
+0

очистить буфер после прочтения одной строки с помощью 'readLine()' –

+0

'if (userChar == '-') {isMinus = true; } 'должно быть написано' isMinus = userChar == '-'; ' –

+0

@JarrodRoberson Я использую' .equalsIgnoreCase() ' – Abdul

ответ

1

Поскольку он считывает символ за символом, он на самом деле читает г, то возврат каретки (CR) характер , и, наконец, символ линии (LF). Вы можете напечатать значение & увидеть для себя:

System.out.println((int)userChar); 

Он показывает значения кода единицы UTF-16 символов, которые я упоминал. Таким образом, для каждого ввода цикл будет выполняться еще два раза. Затем он возвращается & ждет следующего ввода - вот почему видно всего четыре оператора Enter character:. Вы можете просто использовать что-то вроде readLine().charAt(0), чтобы этого избежать. Вероятно, существует некоторый способ сброса ожидающих ввода в буфер, но я не вспоминаю его прямо сейчас.

+0

Спасибо, что исправлено это – Abdul

+1

Java String, char и Character используют Unicode/UTF-16, поэтому вместо ASCII говорит о значении кода кода UTF-16. –

+0

(+1) Спасибо, сделаю! – Vineet

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