Ume*_*san 12 java java.util.scanner
我必须得到一个字符串输入和一个整数输入,但是输入顺序应该是整数首先出现然后应该要求用户输入字符串
Scanner in = new Scanner(System.in);
input = in.nextLine();
k = in.nextInt();
in.close();
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,但如果我首先采用整数输入,如下面的代码
Scanner in = new Scanner(System.in);
k = in.nextInt();
input = in.nextLine();
in.close();
Run Code Online (Sandbox Code Playgroud)
然后它抛出java.lang.ArrayIndexOutOfBoundsException.
这是我的源文件的完整代码:
import java.util.Scanner;
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
}
请指出我在这里做错了什么.
das*_*ght 35
问题是'\n'整数后面的字符.当你打电话时nextInt,扫描仪会读取int,但它不会消耗'\n'它后面的字符; nextLine那样做.这就是为什么你得到一个空行而不是你期望得到的字符串.
假设您的输入具有以下数据:
12345
hello
Run Code Online (Sandbox Code Playgroud)
以下是输入缓冲区最初的外观(^表示Scanner读取下一条数据的位置):
1 2 3 4 5 \n h e l l o \n
^
Run Code Online (Sandbox Code Playgroud)
之后nextInt,缓冲区看起来像这样:
1 2 3 4 5 \n h e l l o \n
^
Run Code Online (Sandbox Code Playgroud)
第一个nextLine消耗\n,留下你的缓冲区如下:
1 2 3 4 5 \n h e l l o \n
^
Run Code Online (Sandbox Code Playgroud)
现在nextLine调用将产生预期的结果.因此,要修复程序,您只需要在nextLineafter之后添加另一个调用nextInt,并丢弃其结果:
k = in.nextInt();
in.nextLine(); // Discard '\n'
input = in.nextLine();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23313 次 |
| 最近记录: |