1

私はこのコードを持っており、ユーザーによる次の入力を待つことになっている最初のときにスキップする面を除いて、すべてが私が望むように実行されています。コードは次のとおりです。

import java.util.Scanner;
public class mainThread {
    public static int size;
    public static int counter;
    public static Scanner input = new Scanner(System.in);
    public static String currentIn;
    public static void main(String[] args){
        System.out.println("Please type the desired amount of players: ");
        size = input.nextInt();
        String nameArray[] = new String[size];
        for(int counter = 0; counter < size; counter++){
            System.out.println("Please enter the name of player " + (counter+1));
            currentIn = input.nextLine();
            nameArray[counter] = currentIn;
            System.out.println(nameArray[counter]);
        }
    }
}

コンソールの内容は次のとおりです。

Please type the desired amount of players: 
3
Please enter the name of player 1

Please enter the name of player 2
Jacob
Jacob
Please enter the name of player 3

最初のループを完全にスキップし、理由がわからないようです。御時間ありがとうございます!

4

4 に答える 4

1

nextInt()「3」だけを読み取りますが、改行部分は読み取りません。基本的には最初のトークンセパレーターまで読み取るだけですが、それを消費することはありません。したがって、入力した場合

3 Foo

次にリターンキーを押すと、最初のプレーヤーの名前として「Foo」が使用されます。

nextLine()プレイヤーの数を見つけるときにも、おそらく使用したいと思うようです。

String playerCountText = input.readLine();
size = Integer.parseInt(playerCountText); // Or use a NumberFormat

個人的には、私はいつもScannerこのように少し厄介であることに気づきました-それはすべてを単純にすることを約束しますが、あなたは本当にそれがすることになるすべてを解決する必要があります...

于 2013-03-24T08:42:30.530 に答える
1

プログラムを次のように変更しました。

import java.util.Scanner;
public class mainThread {
    public static int size;
    public static int counter;
    public static Scanner input = new Scanner(System.in);
    public static String currentIn;
    public static void main(String[] args){
        System.out.println("Please type the desired amount of players: ");
        size = Integer.parseInt(input.nextLine().trim());
        String nameArray[] = new String[size];
        for(int counter = 0; counter < size; counter++){
            System.out.println("Please enter the name of player " + (counter+1));
            currentIn = input.nextLine();
            nameArray[counter] = currentIn;
            System.out.println(nameArray[counter]);
        }
    }
}

問題は\n、バッファに残っていることであり、それ.nextLine()がスキップされた理由です。

編集、次のプログラムもいくつかの入力検証が行われています:

import java.util.Scanner;
public class mainThread {
    public static int size;
    public static int counter;
    public static Scanner input = new Scanner(System.in);
    public static String currentIn;
    public static void main(String[] args){
        boolean valid = false;
        System.out.println("Please type the desired amount of players: ");
        while(valid == false){
         try{
           size = Integer.parseInt(input.nextLine().trim());
           valid = true;
         }catch(Exception e){
            System.out.println("Error input, try again");
         }
        }
        String nameArray[] = new String[size];
        for(int counter = 0; counter < size; counter++){
            System.out.println("Please enter the name of player " + (counter+1));
            currentIn = input.nextLine();
            nameArray[counter] = currentIn;
            System.out.println(nameArray[counter]);
        }
    }
}
于 2013-03-24T08:44:47.913 に答える
0

何が問題なのかわかりませんが、回線を入れ替えれば

currentIn = input.nextLine();

と:

currentIn = input.next();

それが動作します。

于 2013-03-24T08:46:27.937 に答える
0

基本的には、入力3を入力してEnterキーを押すと、Enterキーはバッファーに残っている改行値としてカウントされ、ループ内で改行を読み取ろうとします。

currentIn = input.nextLine();

初めて、保存された新しい行を入力として受け取ります。currentIn = input.nextLine();を追加することで、これを回避できます。サイズ後=input.nextInt();

またはファイルから入力を読み取ります。

于 2013-03-24T09:03:15.110 に答える