2013-08-19 58 views
0

我已经成功地从input.c文件中删除单行和多行注释,但input.c文件中的任何注释都在output.c文件中创建了空行。如何删除它们?从c文件中删除注释后删除空格

#include<stdio.h> 
int main() 
{ 
    FILE *f1,*f2; 
    char c; 
    int i=0; 
    f1=fopen("input.c","r"); 
    f2=fopen("output.c","w"); 

    while((c=getc(f1))!=EOF) 
    { 
     if(c=='/') 
     { 
      if((c=getc(f1))=='*') 
       { 
        do 
        { 
        c=getc(f1); 
        }while(c!='*'); 

        c=getc(f1); 
        if(c=='/') 
        c=getc(f1); 
       } 
      else 
      { 
       if(c=='/') 
        { 
         do 
         { 
         c=getc(f1); 
         }while(c!=10); 
        } 
      } 
     } 
    fseek(f2,1,i++); 
    putc(c,f2); 
    } 
fclose(f1); 
fclose(f2); 
return 0; 
} 
+0

您的代码块评论是有缺陷的。如果块注释包含嵌入的'*'字符,它将无法正常工作。 –

+0

是的,你是对的。我知道,但它只是一个非常基本的程序,以了解编译器的工作原理。 – sandy

+0

如果您只想了解编译器如何工作,您的程序太复杂了(并且正确工作,即消除空行,是根本不重要)。 – mah

回答

1
c=getc(f1); 
if(c=='/') 
c=getc(f1); 

这里做的:结束 '/' 后

if (c=='\n') 
    c=getc(f1); /* that will read next char from input, when last red char is '\n' */ 

最后一行读取下一个字符。只有当它不是'\ n'时,才应该将c放在输出文件中。

同样在这里:

do 
{ 
c=getc(f1); 
}while(c!=10); 

这里始终做到:

c=getc(f1); 

删除 '\ n' 是必须在C变量停止循环执行。

这应该看起来像这样实际工作。

#include<stdio.h> 
int main() 
{ 
    FILE *f1,*f2; 
    char c; 
    f1=fopen("fahr.c","r"); 
    f2=fopen("output.c","w"); 

    while((c=getc(f1))!=EOF) 
    { 
     if(c=='/') 
     { 
      if((c=getc(f1))=='*') 
       { 
        do 
        { 
        c=getc(f1); 
        }while(c!='*'); 

        c=getc(f1); 
        if(c=='/') 
      c=getc(f1); 
      if(c=='\n') 
      c=getc(f1); 
       } 
      else 
      { 
       if(c=='/') 
        { 
         do 
         { 
         c=getc(f1); 
         }while(c!=10); 
       c=getc(f1); 
        } 
      } 
     } 
    putc(c,f2); 
    } 
fclose(f1); 
fclose(f2); 
return 0; 
} 
+0

您对单线评论的建议有效。然而,阻止评论可以在任何地方开始和结束。在下一个换行符之前的块注释之后可能有有效的代码。因此,在删除行尾字符之前,您必须检查该行上是否有有效的代码。 –

+0

如果有任何问题,它将继续使用有效的代码。当它看起来像*/\ n它会删除\ n。如果有* /正确的代码,它将按照它应该继续进行,而不是触摸新行或'/'后面的第一个字符。可以看看它错在哪里。 – zubergu

+0

zubergu,其工作。但现在它全部进入一条线。我希望如果它和以前一样,除了空格 – sandy