当前位置: 首页 > 面试题库 >

无法同时使用Scanner.nextInt()和Scanner.nextLine()[重复]

查锦程
2023-03-14
问题内容

我必须获得一个字符串输入和一个整数输入,但是输入的顺序应该是整数首先出现,然后应该要求用户输入字符串

Scanner in = new Scanner(System.in);


    input = in.nextLine();
    k = in.nextInt();

    in.close();

上面的代码工作正常,但是如果我先接受整数输入,如下面的代码

Scanner in = new Scanner(System.in);

    k = in.nextInt();
    input = in.nextLine();


    in.close();

然后抛出java.lang.ArrayIndexOutOfBoundsException。

这是我的源文件的完整代码:

import java.util.Scanner;

公共类StringSwap {

public static void main(String args[]) {
    String input;
    int k;

    Scanner in = new Scanner(System.in);

    k = in.nextInt();
    input = in.nextLine();


    in.close();

    int noOfCh = noOfSwapCharacters(input);
    originalString(input, noOfCh, k);

}

public static int noOfSwapCharacters(String s) {

    char cS[] = s.toCharArray();
    int i = 0, postCounter = 0;
    while (cS[i] != '\0') {
        if (cS[i] != '\0' && cS[i + 1] != '\0') {

            cS[cS.length - 1 - postCounter] = '\0';

            postCounter++;

        }
        i++;
    }

    return postCounter;

}

public static void originalString(String s, int noOfCh, int k) {    
    int counter = 1, chCounter = 0;
    char cArray[] = s.toCharArray();
    String post = "";
    String pre = "";
    String finalString = "";
    char temp;

    for (int i = 1; i <= k; i++) {
        chCounter = 0;
        counter = 1;
        post = "";
        pre = "";

        for (int j = 0; j < cArray.length; j++) {

            if (counter % 2 == 0 && chCounter <= noOfCh) {
                temp = cArray[j];
                post = temp + post;
                cArray[j] = '\0';
                chCounter++;

            }
            counter++;

        }
        for (int h = 0; h < cArray.length; h++) {

            if (cArray[h] != '\0')
                pre = pre + cArray[h];

        }

        finalString = pre + post;
        for (int l = 0; l < finalString.length(); l++) {
            cArray[l] = finalString.charAt(l);

        }

    }

    System.out.println(finalString);
}

}

请指出我在这里做错了什么。


问题答案:

问题是'\n'整数后面的字符。当您调用时nextInt,扫描程序会读取int,但不会消耗'\n'其后的字符;而是,它不会占用任何字符。nextLine做到这一点。这就是为什么您得到空行而不是预期得到的字符串的原因。

假设您的输入包含以下数据:

12345
hello

这是输入缓冲区最初的外观(^代表Scanner读取下一个数据的位置):

1  2  3  4  5 \n h  e  l  l  o \n
^

之后nextInt,缓冲区如下所示:

1  2  3  4  5 \n h  e  l  l  o \n
              ^

第一个nextLine消耗\n,使缓冲区如下所示:

1  2  3  4  5 \n h  e  l  l  o \n
                 ^

现在,该nextLine呼叫将产生预期的结果。因此,要修复程序,您所需要做的就是向nextLineafter之后添加另一个调用nextInt,并丢弃其结果:

k = in.nextInt();
in.nextLine(); // Discard '\n'
input = in.nextLine();


 类似资料:
  • 我必须得到一个字符串输入和一个整数输入,但输入的顺序应该是整数在先,然后要求用户输入字符串 上面的代码工作得很好,但是如果我首先输入一个整数,就像下面的代码 然后抛出java.lang.ArrayIndexOutOfBoundsException。 下面是我源文件的完整代码: 公共类StringSwap{ } 请指出我在这里做错了什么。

  • 问题内容: 我的教授倾向于执行以下操作来从用户那里获得一个号码: 与简单地做相比有什么好处? 包含以下内容: 正如我所看到的,除了其他的轨迹外,还调用Integer.parseInt()本身。简单地做会带来显着的性能提升吗?另一方面是否有任何弊端? 扫描包含大量数据而不是用户输入的文件时怎么样? 问题答案: 有2个观察结果: 在新行字符后面使用叶子。因此,如果在之后调用,则会读取换行符,而不是实际

  • 我完全是Java的初学者。我制作了一个类,想输入一个数字和一个字符串,但我认为s=in。nextLine() 忽略此行。如何逐行输入两个值。

  • 问题内容: 尝试使用中的方法时遇到麻烦。 这是我尝试过的: 示例1:此示例按预期方式工作。该行;等待输入,然后再继续。 产生输出: 示例2:此示例无法正常工作。本示例使用while循环以及结构允许用户选择要执行的操作。一旦程序到达;,它就不会等待输入,而是执行该行;。 产生输出: 这使得不可能输入句子。 为什么示例不能按预期工作?唯一之间的区别。和是那个 具有循环和结构。我不明白为什么这会影响的行

  • 输出:false 为什么?有人能解释一下吗?

  • 莫奇托官方文件说: 警告: 如果使用参数匹配器,则所有参数都必须由匹配器提供。 例如:(示例显示验证,但同样适用于存根): 匹配器方法(如、)不返回匹配器。在内部,它们在堆栈上记录一个匹配器并返回一个伪值(通常为空)。 我很好奇为什么即使任何类似(的方法返回,也无法在值旁边使用。