2010-10-05 15 views
0

我想創建一個程序,給定一個輸入文件,返回所有代碼行的計數輸入文件,不包括空白行和註釋行。我寫了下面的代碼,但是我需要幫助你如何排除包含註釋和空白行的行。程序讀取代碼並計算其中的行數,不包括註釋和計數空行

#include<stdio.h> 
int main() 
{ 
    int count; 
    char ch; 
    FILE *fptr; 
    clrscr(); 
    fp=fopen("test.cpp","r"); 
    if(fp==EOF) 
     { 
     perror("Error:"); 
     } 
    else 
    { 
     while(ch!=EOF) 
     { 
      ch=fgetc(fptr); 
      if(ch=='\n') 
       count++; 
      if(ch=='\\') 
       count--; 
      if(ch=='\*') 
          { 
       while(ch!='*\') 
            { 
        ch=fgetc(fptr); 
            } 
      } 
     } 
    printf("the lines in the code are %d\n",count); 
    fclose (fptr) 
    } 
    getchar(); 
    return 0; 
} 

如何修改上述代碼,以便空行和註釋行不計算在內?

+5

究竟是如何「不工作」? – 2010-10-05 04:17:03

+0

如何修改上面的代碼,以便空行和註釋行不計數? – 2010-10-08 15:57:47

+0

未初始化的'ch'。它可能發生你的程序甚至從來沒有進入while循環。 – pmg 2010-10-08 16:00:21

回答

3

如果你讀通過字符輸入文件的字符,你必須比如果通過線閱讀網上很多更多的工作。畢竟你們數行...

psudocode

 
    1. initialize line count to 0 
    2. read a line 
    3. end of file? yes: goto 7 
    4. is it a good line? yes: goto 5; no: goto 2 
    5. increment line count 
    6. repeat from 2 
    7. output line count 

現在你問...什麼是好的路線?
對於程序的近似,我建議你考慮一行除了由0或更多空格組成的行以外的所有行。這個近似值會計算評論,但是你可以從這裏開發你的程序。

以下版本忽略了在其他空行上使用// coments的行。

3版可以忽略含有/**/

和版本4線將處理多行註釋。

最重要的是,玩得開心!

+0

非常感謝,真的很有幫助。 – 2010-10-08 17:05:42

0

那麼,部分問題是你的ch變量只是一個字符的長度,但是當你測試註釋時,比如\\\*,這些是兩個字符長的,因此需要使用字符串比較。

另一個問題是C/C++中的單行註釋實際上以//開頭,多行註釋以/*開始並以*/結束。

2

C的評論是///* */。下面的幾行是你的問題是:

 if(ch=='\\') 
      count--; 
     if(ch=='\*') 
      while(ch!='*\') 
       ch=fgetc(fptr); 

另一個問題是,你可以通過閱讀一次一個字符沒有某種狀態機的匹配兩個字符的註釋分隔符。

此外,您的代碼應該滿足註釋嵌入在實際代碼行中的情況。例如。

x = 1; // Set value of x 

你會好得多讀取該文件在一個時間線,並檢查各行是否爲空白或註釋,並增加一個計數器,如果沒有。

+0

我應該怎麼做評論?任何提示?以及我如何處理空行? – 2010-10-05 04:24:05

+0

我會讀取每一行,剝離開頭和結尾的空格,然後確定該字符串是否爲空,是註釋還是實際代碼。 – 2010-10-05 04:30:16

+0

以及如果註釋之間的代碼? – 2010-10-05 09:15:20

1

你的意思///*和* /而不是\ *和* \

的\用作轉義字符,這之後它改變了人物的「意義」。

\ n給你一個換行符。與\\你得到一個單\和'你得到的東西,不關閉開幕'

如果你用正確的替換這些評論字符,你應該得到的代碼將編譯。 但它不會正確計數。

想象這樣一行:

doSomething(); // foo 
1

除了你使用字符常量的問題,你在處理fputc的方式上有錯誤。 fputc返回int。它可以返回EOF,如果沒有剩餘的字符爲紅色或出現錯誤,則返回負整數常量,或者返回讀取的字符的值作爲unsigned char並轉換爲int

如果你比較它與EOF然後一個有效的字符可能比較爲等於EOF造成你的循環的提前終止之前的fputc返回值轉換爲char

另外,不是while循環在第一次調用fputc之前開始,因此您在第一次迭代中使用了未初始化的值ch。這可能會導致發生任何事情。

的慣用方式,形成循環將是:

int ch; 
while ((ch = fgetc()) != EOF) 
{ 
    /* ... */ 
} 

在側,你需要在返回值的比較謹慎,由於這樣的事實環路ch是轉換爲unsigned char一個int

在大多數平臺上,最簡單的做法是創建一個用於比較的char變量,儘管您可以將字符常量放在相同的unsigned charint轉換例程中。

E.g.

char c = ch; 

if (c == '\n') 

if (ch == (unsigned char)'\n') 

其他人則指出,與你的性格文字的問題。