Can't use Scanner.nextInt() and Scanner.nextLine() together [duplicate]

故事扮演 提交于 2019-11-26 11:07:50

问题


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();

then it throws the java.lang.ArrayIndexOutOfBoundsException.

Here\'s the complete code of my source file:

import java.util.Scanner;

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.


回答1:


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
^

After nextInt, the buffer looks like this:

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

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

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

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();


来源:https://stackoverflow.com/questions/23036062/cant-use-scanner-nextint-and-scanner-nextline-together

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!