文字列入力と整数入力を取得する必要がありますが、入力の順序は整数が最初に来るようにしてから、ユーザーに文字列入力を要求する必要があります
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
呼び出しは期待される結果を生成します。したがって、プログラムを修正するには、nextLine
の後にnextInt
への別の呼び出しを追加し、その結果を破棄するだけです。
k = in.nextInt();
in.nextLine(); // Discard '\n'
input = in.nextLine();