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

设置flag为 true 后,您将在第二个中使用整个输入

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

堵塞。

另外,(一旦你解决了):一旦你设置了flag,你永远不会取消它

于 2012-05-18T14:25:42.477 回答
0

你的代码中没有任何地方是你在寻找的*/,这标志着多行注释的结束。结果,一旦注释从第 2 行开始,它就永远不会结束。

此外,对于这个特定任务,我建议一次查看输入一个字符,而不是一次Scanner查看一个标记。再加上一个简单的状态机,这可能会导致一个简单而健壮的实现。

于 2012-05-18T14:26:05.633 回答
0

您应该在整个文件内容上使用 2 个正则表达式(用于 /**/ 和 //),而不是逐行工作。

于 2012-05-18T14:29:53.973 回答