Nie mogę użyć skanera.nextInt () i Scanner.nextLine () razem [duplikat]

to pytanie ma już odpowiedzi tutaj : Skaner pomija nextline() po użyciu next() lub nextFoo()? (21 odpowiedzi) Zamknięty 4 lata temu .

Muszę uzyskać string input i integer input, ale tam kolejność wprowadzania powinna być taka, że integer jest pierwszy, a użytkownik powinien zostać poproszony o string input

Scanner in = new Scanner(System.in);


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

    in.close();

Powyższy kod działa dobrze, ale jeśli najpierw wezmę liczbę całkowitą, jak w poniższym kodzie

Scanner in = new Scanner(System.in);

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


    in.close();

Potem wyrzuca Javę.lang.ArrayIndexOutOfBoundsException.

Oto Pełny kod mojego źródła plik:

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

}

Uprzejmie zwróć uwagę na to, co robię źle.
Author: Umer Hassan, 2014-04-12

1 answers

Problemem jest znak '\n', który podąża za Twoją liczbą całkowitą. Gdy wywołujesz nextInt, skaner odczytuje int, ale nie pochłania znaku '\n' po nim; robi to nextLine. Dlatego otrzymujesz pustą linię zamiast ciągu, którego oczekiwałeś.

Załóżmy, że Twoje dane wejściowe zawierają następujące dane:

12345
hello

Oto jak początkowo wygląda bufor wejściowy (^ przedstawia pozycję, na której Scanner odczytuje następny fragment data):

1  2  3  4  5 \n h  e  l  l  o \n
^

Po nextInt bufor wygląda tak:

1  2  3  4  5 \n h  e  l  l  o \n
              ^

Pierwszy nextLine zużywa \n, pozostawiając swój bufor w następujący sposób:

1  2  3  4  5 \n h  e  l  l  o \n
                 ^

Teraz wywołanie nextLine da oczekiwany wynik. Dlatego, aby naprawić swój program, wystarczy dodać kolejne wywołanie do nextLine po nextInt i odrzucić jego wynik:

k = in.nextInt();
in.nextLine(); // Discard '\n'
input = in.nextLine();
 36
Author: Sergey Kalinichenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-12 21:06:56