首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能同时使用Scanner.nextInt()和Scanner.nextLine()

不能同时使用Scanner.nextInt()和Scanner.nextLine()
EN

Stack Overflow用户
提问于 2014-04-13 05:01:07
回答 1查看 25.5K关注 0票数 13

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

代码语言:javascript
复制
Scanner in = new Scanner(System.in);


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

    in.close();

上面的代码运行良好,但如果我首先接受一个整数输入,如下面的代码所示

代码语言:javascript
复制
Scanner in = new Scanner(System.in);

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


    in.close();

然后抛出java.lang.ArrayIndexOutOfBoundsException。

下面是我的源文件的完整代码:

代码语言:javascript
复制
import java.util.Scanner;

公共类StringSwap {

代码语言:javascript
复制
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);
}

}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-13 05:06:57

问题出在整数后面的'\n'字符。当您调用nextInt时,扫描程序读取int,但它不使用后面的'\n'字符;nextLine执行此操作。这就是为什么你会得到一个空行,而不是你期望得到的字符串。

假设您的输入包含以下数据:

代码语言:javascript
复制
12345
hello

下面是输入缓冲区最初的样子(^表示Scanner读取下一段数据的位置):

代码语言:javascript
复制
1  2  3  4  5 \n h  e  l  l  o \n
^

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

代码语言:javascript
复制
1  2  3  4  5 \n h  e  l  l  o \n
              ^

第一个nextLine使用\n,缓冲区如下所示:

代码语言:javascript
复制
1  2  3  4  5 \n h  e  l  l  o \n
                 ^

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

代码语言:javascript
复制
k = in.nextInt();
in.nextLine(); // Discard '\n'
input = in.nextLine();
票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23036062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档