0

たとえば、次のテキストを考えてみましょう。

import java.util.*;

/* My program
by           */
public class Program {
   public static void main(String[] args) {
      System.out.println("Hello, world!"); // a println
   }

   public static /* Hello there */ void foo() {
      System.out.println("Goodbye!"); // comment here
   } /* */
}

ファイルにこのテキストが含まれている場合、プログラムは次のテキストを出力する必要があります。

import java.util.*;

public class Program {
   public static void main(String[] args) {
      System.out.println("Hello, world!");
   }

   public static  void foo() {
      System.out.println("Goodbye!");
   }
}

さて、私はそのためのコードを書き、stripComments問題のファイルのスキャナー入力を受け入れる関数に名前を付けました:

public void stripComments(Scanner input){

    while(input.hasNextLine()){
        boolean flag=false;

        String scan=input.nextLine();
        Scanner line=new Scanner(scan);
        while(line.hasNext()){

            String token=line.next();
            if(token.equals("/*")){
                while(line.hasNext()){

                    if(line.next().equals("\\*")){
                        token=line.next();
                        flag=true;
                        break;
                    }
                }
                if(!flag){
                    while(input.hasNextLine()){
                        scan=input.nextLine();
                        line=new Scanner(scan);


                        while(line.hasNext()){

                            token=line.next();
                            if(token.equals("*\\")){

                                token=line.next();
                                flag=true;
                                break;
                            }
                        }

                    }

                }
            }
            else{
                System.out.print(token+" ");

            }


        }
        System.out.println();


    }

}

ただし、生成される出力は次のとおりです。

import java.util.*; 

それでおしまい!!!!

誰かが私が間違っていた場所を指摘できますか?

4

3 に答える 3

0

*/コードのどこにも、複数行のコメントの終わりを示すを探していません。その結果、コメントが 2 行目で開始されると、コメントが終了することはありません。

Scannerまた、この特定のタスクでは、一度に 1 つのトークンではなく、一度に 1 文字ずつ入力を確認することをお勧めします。シンプルなステート マシンと組み合わせると、シンプルで堅牢な実装につながる可能性があります。

于 2012-05-18T14:26:05.633 に答える
0

行ごとに作業するのではなく、ファイルの内容全体で 2 つの正規表現 (/**/ と //) を使用する必要があります。

于 2012-05-18T14:29:53.973 に答える
0

true に設定flagすると、2 番目に入力全体が消費されます

while(input.hasNextLine()){ 
  //...
}

ブロック。

また、(修正したら):一度設定するflagと、設定を解除することはありません

于 2012-05-18T14:25:42.477 に答える