【问题标题】:Can't use Scanner.nextInt() and Scanner.nextLine() together [duplicate]不能同时使用 Scanner.nextInt() 和 Scanner.nextLine() [重复]
【发布时间】:2014-05-26 23:52:04
【问题描述】:

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

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

}

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

【问题讨论】:

    标签: java java.util.scanner


    【解决方案1】:

    问题在于整数后面的'\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 调用将产生预期的结果。因此,要修复您的程序,您只需在nextInt 之后添加另一个对nextLine 的调用,并丢弃其结果:

    k = in.nextInt();
    in.nextLine(); // Discard '\n'
    input = in.nextLine();
    

    【讨论】:

    • 非常感谢,这是一个很好的解释:)
    • 为什么要调用nextInt,将缓冲区从1移到5?我原以为它会从 1 变为 2。
    • @NoniA。这是因为缓冲区中的int 恰好是五个字符长。
    • 这是有史以来最好的解释
    • 不敢相信我不知道!伟大的解释人!
    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多