Игнорирование / очистка дополнительных целых чисел от пользовательского ввода

#java #input #integer

#java #ввод #целое число

Вопрос:

Я застрял в этой части программы, где пользователь вводит несколько целых чисел, и выбирается только первое. В моем текущем коде вывод такой.

 There are 10 sticks on the board.
Jerry: How many sticks do you take (1-3)? *1 3 4 2*
There are 9 sticks on the board.
Sherry: How many sticks do you take (1-3)? There are 6 sticks on the board.
Jerry: How many sticks do you take (1-3)? Please enter a number between 1 and 3.
Jerry: How many sticks do you take (1-3)? There are 4 sticks on the board.
Sherry: How many sticks do you take (1-3)? 
  

В то время как в данном примере вывод таков.

 Jerry: How many sticks do you take (1-3)? *1 3 4 2*
There are 8 sticks on the board.
Pat: How many sticks do you take (1-3)? *3*
There are 5 sticks on the board.
  

Кажется, что дополнительные целые числа поставлены в очередь и ожидают следующей команды ввода сканера. В данном примере лишние целые числа удаляются. Как это делается? Есть ли команда для очистки всего текущего пользовательского ввода или все целые числа, считываемые с помощью .hasNextInt и любые после первого, просто отбрасываются? Кроме того, где hasNextInt просматривается во входных данных? Будет ли следующая команда hasNextInt выглядеть в том же месте ввода, если новый ввод не был добавлен?

(Текст, заключенный в **, является пользовательским вводом.)

Комментарии:

1. Пожалуйста, включите свой код в вопрос.

2. Добавьте свой код. Я предполагаю, что вы используете while(sc.hasNextInt()) {} вместо if .

Ответ №1:

Если вы не можете быть уверены, что пользователь правильно введет ввод, вы можете сделать это, приняв String s вместо int s . Вот так:

 Scanner s = new Scanner(System.in);
System.out.print("How many?: ");
int many = Integer.parseInt(s.nextLine().trim().split(" ")[0]);
System.out.println(many);
  

Это даже будет обрабатывать входные данные, такие " 2 5 6 5" как, а также примеры, которые у вас есть, беря всю входную строку, обрезая все начальные и конечные " " s, разделяя строку на массив String s вокруг " " s и возвращая первый (тот, который вы хотите) по индексу 0 .

Чего он не делает, как написано, так это обрабатывает входные данные, такие как " foo bar 42" или любые другие входные данные, где первый индекс разделенной строки не может быть проанализирован как целое число. Попытка сделать это приведет к NumberFormatException .