不能一起使用Scanner.nextInt()和Scanner.nextLine() [英] Can't use Scanner.nextInt() and Scanner.nextLine() together

查看:104
本文介绍了不能一起使用Scanner.nextInt()和Scanner.nextLine()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have to get a string input and an integer input, but there order of input should be that integer comes first then user should be asked for string input

Scanner in = new Scanner(System.in);


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

    in.close();

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

The above code works fine but if I take an integer input first like in the following code

Scanner in = new Scanner(System.in);

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


    in.close();

然后抛出java.lang.ArrayIndexOutOfBoundsException。

then it throws the java.lang.ArrayIndexOutOfBoundsException.

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

Here's the complete code of my source file:

import java.util.Scanner;

public class StringSwap {

public class 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);
}

}

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

Kindly point out what I am doing wrong here.

推荐答案

问题是'\ n' 跟随整数的字符。当您调用 nextInt 时,扫描程序会读取 int ,但它不会消耗' \ n'之后的字符; nextLine 这样做。这就是为什么你得到一个空行而不是你期望得到的字符串。

The problem is the '\n' character that follows your integer. When you call nextInt, the scanner reads the int, but it does not consume the '\n' character after it; nextLine does that. That is why you get an empty line instead of the string that you were expecting to get.

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

Let's say your input has the following data:

12345
hello

以下是输入缓冲区最初的显示方式( ^ 表示扫描程序读取下一页的位置数据):

Here is how the input buffer looks initially (^ represents the position at which the Scanner reads the next piece of data):

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

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

After nextInt, the buffer looks like this:

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

第一个 nextLine 消耗 \ n ,留下你的像这样的缓冲区:

The first nextLine consumes the \n, leaving your buffer like this:

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

现在 nextLine 调用将产生预期结果。因此,要修复您的程序,您只需在 nextInt 之后添加对 nextLine 的另一个调用,并丢弃其结果:

Now the nextLine call will produce the expected result. Therefore, to fix your program, all you need is to add another call to nextLine after nextInt, and discard its result:

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

这篇关于不能一起使用Scanner.nextInt()和Scanner.nextLine()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆