0

私はJavaが初めてで、それを学んでいます。ユーザー入力を取得してトークン化するコードを作成しました。コンパイルは成功しますが、実行すると o/p として「-3」が生成されます。

import java.io.*;


public class TokenTester{

    public static void main(String[] arguments){
    String name;
    StreamTokenizer token;
    BufferedReader reader;
    reader = new BufferedReader(new InputStreamReader(System.in));

     try{
            System.out.println("Enter a String  ");
            name = reader.readLine();
            System.out.println(name);
            token=new StreamTokenizer((new StringReader(name)));
           //token=new StreamTokenizer(name);
            // Using new StreamTokenizer(name) throws error
            //error: no suitable constructor found for StreamTokenizer(String)
             while(token.nextToken()!= token.TT_EOF)
            {
             System.out.println(token.nextToken());
                }
            }
        catch (IOException ioe){
             System.out.println("An unexpected error occured.");
        }

        }
    }

また、新しい StreamTokenizer(name) を使用すると、「エラー: StreamTokenizer(String) に適したコンストラクターが見つかりません」というエラーがスローされます

while(token.nextToken()!= token.TT_EOF) を使用すると、無限ループが o/p として -1 であることが示されます

以下のコードは問題なく動作します:

import java.util.StringTokenizer;

 class TokenTester {

 public static void main(String[] arguments) {
 StringTokenizer st1, st2;

 String quote1 = "VIZY 3 -1/16";
 st1 = new StringTokenizer(quote1);
 System.out.println("Token 1: " + st1.nextToken());
 System.out.println("Token 2: " + st1.nextToken());
 System.out.println("Token 3: " + st1.nextToken());

 String quote2 = "NPLI@9 27/32@3/32";
 st2 = new StringTokenizer(quote2, "@");
 System.out.println("\nToken 1: " + st2.nextToken());
System.out.println("Token 2: " + st2.nextToken());
System.out.println("Token 3: " + st2.nextToken());
 }
 }

私のコードで問題を理解できません。ガイドしてください。

私は参照しました:

http://tutorials.jenkov.com/java-io/streamtokenizer.html
http://www.java-samples.com/showtutorial.php?tutorialid=397
http://docs.oracle.com/javase/7/docs/api/

ありがとうガウラフ

4

3 に答える 3

1

最初の例では StreamTokenizer を使用し、2 番目の例では StringTokenizer を使用します。したがって、最初の例で実行可能にするには、StreamTokenizer を StringTokenizer に置き換える必要があります。そしてもちろん、StringTokenizer に関連する適切なメソッドを使用する必要があります。

于 2013-01-31T16:16:11.103 に答える
0

StreamTokenizer クラスは入力ストリームを受け取り、それを「トークン」に解析して、トークンを一度に 1 つずつ読み取ることができるようにします。解析プロセスは、テーブルと、さまざまな状態に設定できるいくつかのフラグによって制御されます。ストリーム トークナイザーは、識別子、数字、引用符で囲まれた文字列、およびさまざまなコメント スタイルを認識できます。

一方、文字列トークナイザー クラスを使用すると、アプリケーションは文字列をトークンに分割できます。トークン化の方法は、StreamTokenizer クラスで使用される方法よりもはるかに単純です。

最初の例は StreamTokenizer を示し、2 番目の例は StringTokenizer を示しています。

于 2013-01-31T16:24:25.880 に答える
0

トークンの値は、token.sval を介してアクセスできます。

これを試して:

try{
        System.out.println("Enter a String  ");
        name = reader.readLine();
        System.out.println(name);
        token=new StreamTokenizer((new StringReader(name)));
        int numberOfTokens = token.nextToken(); //<----nextToken() returns an integer 
         while(numberOfTokens!= token.TT_EOF)
        {
         System.out.println(token.sval);  //<---- take sval
         numberOfTokens = token.nextToken();
            }
        }


    catch (IOException ioe){
         System.out.println("An unexpected error occured.");
    }

while(token.nextToken()!= token.TT_EOF) を使用すると、無限ループが o/p として -1 であることが示されます

==> この無限ループは、1 つの単一ループで 2x をインクリメントするために発生します。

  • 最初のインクリメントは次のとおりです: while(token. nextToken() != token.TT_EOF)

  • 2 番目のインクリメントは次のとおりです: System.out.println(token. nextToken() );

于 2013-01-31T16:25:19.080 に答える