当前位置: 首页 > 知识库问答 >
问题:

无法同时使用Scanner.NextInt()与Scanner.NextLine()[duplicate]

斜和硕
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);
}

}

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

共有1个答案

尹欣怿
2023-03-14

问题是整数后面的'\n'字符。当您调用nextint时,扫描器读取int,但它不消耗后面的'\n'字符;nextline就是这样做的。这就是为什么您得到的是一个空行,而不是您期望得到的字符串。

假设您的输入有以下数据:

12345
hello

以下是输入缓冲区最初的外观(^表示扫描器读取下一段数据的位置):

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调用将产生预期的结果。因此,要修复您的程序,您所需要的只是在nextint之后向nextline添加另一个调用,并丢弃其结果:

k = in.nextInt();
in.nextLine(); // Discard '\n'
input = in.nextLine();
 类似资料:
  • 问题内容: 我必须获得一个字符串输入和一个整数输入,但是输入的顺序应该是整数首先出现,然后应该要求用户输入字符串 上面的代码工作正常,但是如果我先接受整数输入,如下面的代码 然后抛出java.lang.ArrayIndexOutOfBoundsException。 这是我的源文件的完整代码: 公共类StringSwap { } 请指出我在这里做错了什么。 问题答案: 问题是整数后面的字符。当您调用

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

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

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

  • 我有一个程序,从命令行接收来自用户的输入。令人恼火的是,第一次使用扫描器时,输入的文本会出现在下一行(之后)。但是,其他所有时候它都与在同一行。 代码:

  • 问题内容: 当我直接使用(没有诸如Scanner之类的界面)接收数据时,它不会阻塞。但是,当我尝试使用Scanner时(类似于我们从接收字符串的方式),它确实可以。我想知道这样做的原因,以及所连接的Socket提供给您的InputStream与in的不同之处。 用于测试的客户端(用于两个服务器) 挂起的代码: 不阻塞的代码: 问题答案: (我认为您已经知道了这一点,但是…) 该方法返回当前行的其余