Tuesday 7 May 2019

java - Can't use Scanner.nextInt() and Scanner.nextLine() together




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.


Answer



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

No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...