2013-08-19 117 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