3

以下の例では、ユーザーからの単一文字入力を受け入れようとしていますが、プログラムを実行すると、do..while ループが複数回実行されます。以下のプログラムの結果を参照してください。

誰かが答えを手伝ってくれるとしたら、この問題を解決するにはどうすればよいですか?

import java.io.*;



public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {



            char c;
           // BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            DataInputStream in =new DataInputStream(System.in);

            // Asking the user what to do with the application
           do{ 

            System.out.println("Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E' ");          

            byte b = in.readByte();
            c = (char) b;
            c = Character.toUpperCase(c);

            if (c=='Y'){
                System.out.println(c);
               }
            else if (c=='N') {
              System.out.println(c);
            }
            else if (c=='E'){
               System.out.println(c); 
            }
            else{
                System.out.println("Incorrect Entry, try again: "+c); 
            }

           }while (c!='E');

    }

}

出力

init:
deps-jar:
compile:
run:
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E' 
asdfgaf
Incorrect Entry, try again: A
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E' 
Incorrect Entry, try again: S
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E' 
Incorrect Entry, try again: D
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E' 
Incorrect Entry, try again: F
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E' 
Incorrect Entry, try again: G
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E' 
Incorrect Entry, try again: A
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E' 
Incorrect Entry, try again: F
Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E' 
Incorrect Entry, try again: 

Would you like to access your account, if yes,type 'Y' or if you want to create a new account press 'N'to exit press 'E' 
4

6 に答える 6

2

DataInputStream を使用することは、おそらく状況を処理する最良の方法ではありません。

DataInputStream は、入力した入力をバッファリングします。これが、ループで不要な長いメッセージを取得する理由です。

代わりにスキャナーを使用してみてください。スキャナーの例を次に示します。

Scanner objScanner = new Scanner(System.in);
char c = objScanner.next().charAt(0);
System.out.println(c);
于 2013-02-14T09:24:04.213 に答える
2

DataInputStream の代わりに System.in.read() を使用します。

于 2013-02-14T09:30:42.900 に答える
1

DataInputStream( InputStream) は基本的にバイナリ構造です。テキスト データを (コンソールなどから) 読みたい場合は、Reader を使用する必要があります。ソースコードにコメントアウトがありましたBufferedReader。の代わりに同じものを使用することをお勧めしますDataInputStream。あなたは以下のようにすることができます、

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String input = in.readLine();

または、 を使用できますがDataInputStream.readLine()、理由により非推奨です。また、 を使用することも提案されていますBufferedReader.readLine()

Scannerなどの他のオプションを選択できます。

于 2013-02-14T09:36:55.797 に答える
0

このスレッドにはまだ ACCEPTED ANSWER がないため、非常に古いものですが、回答します。まだ説明が欲しい人向け。

を使用するScannerと、状況に最適なアイデアです。スキャナーは使いやすく、完了するまでスレッドを停止します。これを有利に利用することも、新しいスレッドを作成して現在のスレッドを実行し続けることもできます。スキャナーの基本的な使い方:

Scanner s = new Scanner(System.in) //Makes a new scanner with System.in
String letter = s.next(); //Use next to find the character typed
//Insert code using letter variable

「手紙」は、スキャナーのスペースの前にすべてを返します。最初の文字だけを見つけるには、文字列を分割して""から、配列の 1 番目 (0 番目) を取得します。

最後に、スキャナーに関するこのスレッドからの良い引用

next() は、スペースまでしか入力を読み取ることができません。スペースで区切られた 2 つの単語を読み取ることはできません。また、next() は、入力を読み取った後、カーソルを同じ行に配置します。

nextLine() は、単語間のスペースを含む入力を読み取ります (つまり、行末 \n まで読み取ります)。入力が読み取られると、 nextLine() はカーソルを次の行に配置します。

後で複数の単語を検索する場合は、next() の代わりに nextLine() を使用して完全な文字列を取得します。

于 2016-11-18T00:17:05.380 に答える