StringBuilder在Java中附加for循环

时间:2018-07-11 03:24:20

标签: java for-loop stringbuilder

当我执行以下操作时:

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

此外,为什么在单词之前有一个空格?打印功能在输入功能之后。那不应该相反吗?

4 个答案:

答案 0 :(得分:1)

您应将nextLine()替换为next()。

Give book title : Harry Potter
Give book price : 12.5
Give number of volumes : 5
Title: Harry Potter costs 12.5 for 5 volumes.
Give book title : James Anderson
Give book price : 45.6
Give number of volumes : 7
Title: James Anderson costs 45.6 for 7 volumes.
Give book title : Lucas Empire
Give book price : 34.5
Give number of volumes : 7
Title: Lucas Empire costs 34.5 for 7 volumes.

答案 1 :(得分:0)

如果调试该程序,则会发现第一次循环将获得a = [[ 'abc=lalalla', 'appa=kdkdkdkd', 'kkakaka=oeoeoeo'],[ 'abc=lalalla', 'appa=kdkdkdkd', 'kkakaka=oeoeoeo'],[ 'abc=lalalla', 'appa=kdkdkdkd', 'kkakaka=oeoeoeo']] d = [dict(x.split('=') for x in s) for s in a] ,且字符串为空。这是发生问题的时候。

当您为input.nextLine()输入一个3和一个\n时,输入缓冲区包含“ 3 \ n”,而int n = input.nextInt();只会取那个“ 3”,如下图所示:

the position is 1 输入的input.nextInt();为1时,缓冲区中的“ \ n”保持不变。然后,当position所需的程序时,它将读取缓冲区,直到“ \ n”为止,从而导致读取空字符串。

the position changed to 2 after a nextLine()

因此可能的解决方法是在循环之前添加nextLine(),或使用String empty = input.nextLine();代替input.next();,因为在文档中,input.nextLine();将返回下一个令牌。

更新:请注意,没有人在底部回答您的第二个问题...

您应将循环中的行input.next();修改为System.out.println(" ");

答案 2 :(得分:0)

我认为这是因为它读取了将char更改为字符串的行 因此,它将更改行视为第一个和第一个字符串。 您只能输入两个字符串

答案 3 :(得分:0)

如果放置从输入中读取的代码打印行,如下所示:

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()不是解决方案。