我已经使用用户输入指定了数组的大小,但是我的for循环只接受size-1时间的输入



我已经使用用户输入指定了数组的大小,但是我的for循环只接受size-1时间的输入。

import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int time=sc.nextInt();
String input[]=new String[time];
for(int i=0;i<time;i++) 
{
input[i]=sc.nextLine();
}
for(int i=0;i<time;i++) 
{   
int len=input[i].length();
if(len>4)
{
System.out.println(input[i].charAt(0)+ Integer.toString(len-2)+input[i].charAt(len-1));
}
else
System.out.println(input[i]);
}
}
}
我改变了我的代码,它工作得很好改变了
int time=sc.nextInt();

int time=Integer.parseInt(sc.nextLine());

但我不知道背后的原因。有人能解释一下吗?

Scanner.nextInt()方法扫描下一个令牌作为int的输入,而不是直线。例如,如果输入int,然后按回车键,那么它只需要int,而不需要回车。

如果你给出一个像这样的示例输入:

2 xyz //hit enter and give the next input
abc

您将看到nextInt()将从该行获取2作为输入,Scanner.nextLine()即将到来的第一次迭代将考虑xyz作为第一次输入,在下一个迭代中,正如我们给出的abc一样,它将被视为第二次输入。所有这些时间你的代码都是工作的,但是你不能看到,因为它把空字符串作为第一个输入,因为从上一行返回回车。

然而,Scanner.nextLine()将整行作为输入,以及回车,然后将int解析为整数,因此,您将获得数组的字符串输入的下一行。

希望这一切都清楚了。

问题是在第一个for循环中使用的nextLine()方法。因为这个方法将扫描器推进到下一行并返回被跳过的输入,所以它有点像"其中一个循环迭代,它最终允许您将time - 1个元素输入到数组中,而不是time个元素。如果只使用sc.next(),程序就可以正常工作,因此不需要使用

int time=Integer.parseInt(sc.nextLine());

,因为它可能有点复杂(在我看来)比仅仅用next()替换nextLine()。下面是代码:

import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int time = sc.nextInt();
String input[] = new String[time];
for(int i = 0;i < time;i++) 
{
input[i] = sc.next();
}
for(int i = 0;i < time;i++) 
{   
int len = input[i].length();
if(len > 4)
{
System.out.println(input[i].charAt(0) + Integer.toString(len - 2) + input[i].charAt(len - 1));
}
else
System.out.println(input[i]);
}
sc.close();
}
}

最新更新