无法将所有输入放入Java中的字符串数组

问题描述

我已经编写了一个代码来接收字符串输入并将其存储在Java的字符串数组中。我的问题是,当我将字符串数组的大小声明为3时,它必须将三个字符串放入字符串数组中,但只将两个字符串放入字符串数组中,而不接受第三个字符串。谁能帮助我解决问题?

代码

import java.util.Scanner;
public class leet14 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(system.in);
        int n;
        System.out.println("enter length of string");
        n=sc.nextInt();
        String a[]=new String[n];
        System.out.println("enter string values");
        for(int i=0;i<a.length;i++){
            a[i]=sc.nextLine();
        }
        for(int j=0;j<a.length;j++){
           System.out.println(a[j]); 
        }
        }
}

输出

enter length of string
3
enter string values
one
two

one
two

解决方法

您必须先添加sc.nextLine(),然后才能开始从控制台读取输入字符串。

import java.util.Scanner;
public class leet14 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n;
        System.out.println("enter length of string");
        n=sc.nextInt();
        String a[]=new String[n];
        sc.nextLine();
        System.out.println("enter string values");
        for(int i=0;i<a.length;i++){
            a[i]=sc.nextLine();
        }
        for(int j=0;j<a.length;j++){
           System.out.println(a[j]); 
        }
    }
}

这将为您提供所需的结果。

输入:

enter length of string
3
enter string values
one
two
three

输出:

one
two
three
,

当您阅读int并想阅读完整的String时,则必须将Scanner内的指针移动到下一行。 PS 。很容易找到是否调试程序。

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);

    System.out.print("enter length of string: ");
    String[] arr = new String[scan.nextInt()];
    scan.nextLine();    // <-- move to the next line to be ready to read a whole string

    System.out.println("enter string values:");

    for (int i = 0; i < arr.length; i++) {
        System.out.format("line %d: ",i + 1);
        arr[i] = scan.nextLine();
    }

    for (int j = 0; j < arr.length; j++)
        System.out.println(arr[j]);
}

输出:

enter length of string: 3
enter string values:
line 1: one one
line 2: two two
line 3: three three
one one
two two
three three
,

我建议您看一下这段代码,也不要使用诸如n之类的值名称,它确实可以提高可读性并帮助您解决问题。

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
    
    Scanner sc=new Scanner(System.in);
    int inputCount=0;
    System.out.println("enter length of string");
    try{
        inputCount=sc.nextInt();
    }catch(Exception  e){
        System.out.println("int please");
        System.exit(1);
    }
    String a[]=new String[inputCount];
    System.out.println("enter string values");
    
    for(int i=0;i<a.length;i++){
        a[i]=sc.next();
    }
    for(int j=0;j<a.length;j++){
       System.out.println(a[j]); 
    }
  }
}
,

要获得所需的过程,请简单地将a[i]=sc.nextLine();更改为a[i]=sc.next();。除非您的字符串输入中包含空格,否则应该可以正常工作,否则请将sc.nextLine();放在for循环之前

这就是我所看到的问题;

nextInt();期望输入的第一个单词并将其存储为int,否则会引发错误,但是不会超出当前行。

因此,当您运行n=sc.nextInt();并提供输入信息时

enter length of string
3

3已保存到n,但系统光标仍然留在其后,3|

N.B:输出流与输入流不同,因此,System.out.println("enter string values");运行无关紧要,输入流的光标仍停留在3以后;

enter length of string
3|
enter string values

a[i]=sc.nextLine()期望并在光标之后存储该句子,否则它将中断到下一行。但是,如果光标已经在新行上,则可以输入一个新句子(然后根据需要存储它)并移至新行。

因为光标3|之后没有句子,所以它会中断到下一行,并在{时在for循环中将中断行(newline)命令"\n"分配给a[0] {1}},

因此,由于光标现在位于新行上,因此当输入i = 0并进入下一行时,它提供了输入新句子并将其存储到a[1]的选项, i = 1

时执行相同的过程

然后i = 2的内容显示如下;

String[] a

我很乐意对此发表意见,谢谢。