StringBuilder добавляет цикл for в Java

Когда я выполняю следующее:

static void Append() {
    StringBuilder sb = new StringBuilder();
    System.out.print("How many words do you want to append? ");
    int n = input.nextInt();
    System.out.println("Please type the words you want to append: ");
    for (int c = 1; c <= n; c++) {
        String str = input.nextLine();
        sb.append(str);
        System.out.print(" ");
    }
    System.out.print(sb);

}

Допустим, если я поставлю 3, то компьютер позволит мне набрать только 2 слова ..

Это результат:

How many words do you want to append? 3
Please type the words you want to append: 
 I
 am
 Iam

Кроме того, почему перед словами стоит пробел? функция печати находится после функции ввода. Так разве не должно быть наоборот?

где определяется input?

Pankaj Singhal 11.07.2018 05:28

Вход определяется как статическое поле в том же классе. Я знаю, что Scanner # nextLine использует разделители строк, поэтому я вставил println после nextInt, но все равно никакой разницы

Ke Ke 11.07.2018 05:35

добавить input.nextLine(); после строки int n = input.nextInt(); должен работать

soorapadman 11.07.2018 05:45

Ой, я все время вставлял println, мое намерение было следующей строкой ..

Ke Ke 11.07.2018 05:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
1 999
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вам следует заменить nextLine () на next ().

import java.util.Scanner;
public class Main
{
static void Append() {
    Scanner input = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
System.out.print("How many words do you want to append? ");
int n = input.nextInt();
System.out.println("Please type the words you want to append: ");
String str = null;
for (int c = 0; c < n; c++) {
     str = input.next();
    sb.append(str +" " );

}
System.out.print(sb);
}
public static void main(String[] args) {
    System.out.println("Hello World");
    Append();
}
}
Ответ принят как подходящий

Если вы отлаживаете эту программу, вы можете обнаружить, что в первый раз цикл получит input.nextLine() с пустой строкой. Вот тогда и возникает проблема.

Когда вы вводите 3 и \n для int n = input.nextInt();, входной буфер содержит «3 \ n», а input.nextInt(); просто принимает эту «3», как на изображении ниже:

the position is 1 где входной position равен 1, а в буфере остается "\ n". Затем, когда программе требуется nextLine(), она будет читать буфер до "\ n", что приводит к чтению пустой строки.

the position changed to 2 after a nextLine()

Таким образом, возможный обходной путь - добавить String empty = input.nextLine(); перед циклом или использовать input.next(); вместо input.nextLine();, поскольку в документе говорится, что input.next(); вернет следующий токен.

Обновлять: Обратите внимание, что никто не отвечает на ваш второй вопрос внизу ...

Вы должны изменить строку System.out.println(" "); в цикле на sb.append(" ");.

Это то, что я точно подумал. Итак, я вставил следующую строку после nextInt, но все же позволил мне только 2 слова, если я наберу 3

Ke Ke 11.07.2018 05:48

@KeKe Я также пробовал добавить String empty = input.nextLine(); перед циклом, и он показывает ожидаемый для меня результат. Ваша программа не была перекомпилирована?

Geno Chen 11.07.2018 05:51

Нет, я был тупым. Я вставлял PRINTLN все время, когда намеревался вставить nextLine lmao. Спасибо, что ответили на этот глупый вопрос!

Ke Ke 11.07.2018 06:05

Я обновил ответ на ваш вопрос внизу.

Geno Chen 11.07.2018 06:22

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

Если вы поместите строку печати кода, которая была прочитана со ввода, следующим образом:

static void append() {
  Scanner input = new Scanner(System.in);
  StringBuilder sb = new StringBuilder();
  System.out.print("How many words do you want to append? ");
  int n = input.nextInt();
  System.out.println("Please type the words you want to append: ");

  for (int c = 1; c <= n; c++) {
    String str = input.nextLine();
    System.out.println("input str = " + str); //pay attention to this line
    sb.append(str);
    System.out.print(" ");
  }
  System.out.print(sb);
}

вы увидите, что первая итерация не считывает данные с ввода. Потому что в буфере уже есть \n, который был прочитан с помощью nextInt.

Чтобы решить эту проблему, вы можете пропустить строку после nextInt, как в приведенном ниже коде (я не уверен, что это лучшее решение):

static void append() {
  Scanner input = new Scanner(System.in);
  StringBuilder sb = new StringBuilder();
  System.out.print("How many words do you want to append? ");
  int n = input.nextInt();
  System.out.println("Please type the words you want to append: ");

  if (input.hasNextLine()) input.nextLine();

  for (int c = 1; c <= n; c++) {
    String str = input.nextLine();
    System.out.println("input str = " + str);
    sb.append(str);
    System.out.print(" ");
  }
  System.out.print(sb);
}

Использование next () не является решением, если вы хотите читать предложения как одну строку.

Другие вопросы по теме