2012-08-28 21 views
2

我想打印評論給一個給定的程序打印在控制檯?如何在給定的程序中打印評論?

在程序中是否有任何函數和任何自己的邏輯來打印註釋?

例如

int main() 
{ 
    /* this is a comment */ 
} 

上述程序只有一個評論我想打印此評論由特定邏輯或任何功能到控制檯,如果在C 3

+2

舊的'printf()'? –

+0

雅使用printf將是必要的,但如何做到這一點? – kTiwari

+0

雅我試圖在C的文件處理的幫助下做到這一點,但沒有像我想做的那樣。 – kTiwari

回答

8

您需要編寫一個程序來讀取c源文件,並在這些文件中標識和打印註釋。

#include <stdio.h> 

void read_until_char (FILE *f, char c) { 
    // read file until c is found 
} 

void read_until_char_into (FILE *f, char c, char *buf) { 
    // read file until c is found 
    // also write each char read into buffer 
} 

void print_comments(const char *filename) { 
    FILE *f = fopen(filename, "r"); 
    char buffer[2048]; 
    int c; 
    if (f) { 
    while (!feof(f)) { 
     read_until_char(f, '/'); 
     c = fgetc(f); 
     if (c == '*') { 
     while (!feof(f)) { 
      read_until_char_into(f, '*', buffer); 
      if ((c=fgetc(f)) == '/') { 
      // print buffer 
      break; 
      } else if (c == '*') { 
      // consider what to do if c is * 
      } 
     } 
     } else if (c == '/') { 
     read_until_char_into(f, '\n', buffer); 
     // print buffer 
     } 
    } 
    fclose(f); 
    } 
} 
+0

可以請你提供一個簡短的代碼嗎? – kTiwari

+7

@krishnaChandra解析C不是由「短碼」完成的。 – unwind

1

This是一個awk腳本,可以從您的源代碼文件中提取註釋。

3

編譯後的C程序無法訪問自己的源代碼將無法打印註釋。註釋由C預處理器刪除,甚至編譯器也看不到。換句話說,一旦程序可執行,評論文本就不可用。

這就是爲什麼你的方法必須以某種方式直接處理源代碼,你不能在運行時爲程序本身執行此操作。

+0

我們可以做到這一點> ..因爲我們有一個在C中定義的__FILE__宏,它爲我們提供了同一個C文件中的文件內容。 – kTiwari

+1

@krishnaChandra不,這不是'__FILE__'宏擴展到的。它爲您提供當前翻譯單元的名稱,即文件名。不是完整的源代碼。 – unwind

+0

是的,然後使用我們可以解析的文件名.......但這是我卡住的地方 – kTiwari

0

這是一種程序,稱爲Quine

C的例子:

main(){char *c="main(){char *c=%c%s%c;printf(c,34,c,34);}";printf(c,3 
4,c,34);} 

http://en.wikipedia.org/wiki/Quine_(computing)

+0

我不認爲奎因是他所要求的... – nico

+0

此外,一半的multiquine不會真的工作。特別是沒有任何輸出代碼。我已經用[quine頁面](http://www.nyx.net/~gthompso/quine.htm)中的一個小C代替它。如果您不同意編輯,則可以將其回滾 – Hasturkun

1

或許你可以反轉您的問題。爲什麼不使用字符串(可以打印)作爲註釋?評論意見是

  • 他們可以持有漂亮的自由形式的文本。
  • 人們可以在查看源代碼時閱讀它。

字符串文字具有這兩個特徵。

因此

void a_function() 
{ 
    docstring = "This string is a comment. Blah blah."; 
    printf("DOC %s", docstring); 
} 

(Python有一個very similar convention,而這正是我得到的名稱爲 「文檔字符串」)。

0

我對這個問題非常困惑,如果你想打印每一個評論,爲什麼不使用字符串而不是評論?或兩者?爲什麼你需要打印你的程序的評論?只是想知道,因爲我不確定你在這裏做什麼,也許有更好的方法來實現你正在嘗試做的事情。

請問printf("/*foo*/");不行嗎?或者你是否試圖使這種自動?

如果是後者,則需要讓程序解析源文件並搜索註釋(除非有其他更簡單的方法)。

我建議你只讀char字符的C文件,直到遇到/*並開始用每個char填充數組,直到下一次出現*/

如果因任何原因,你所遇到的問題是前者,你不能因爲某些原因打印這裏printf評論是我寫的做一個註釋字符串(很沒有意義的,因爲我99%確定的函數你可以使用printf("/*foo*/")

int printcomment(const char *comment) 
{ 
    char *commentln, open[] = "/*", close[] = "*/"; 
    if(!(commentln = malloc(strlen(comment) + 5))) return 0; 
    strcat(commentln, open); 
    strcat(commentln, comment); 
    strcat(commentln, close); 
    printf("%s", commentln); 
    free(commentln); 
    return 1; 
} 

祝你好運。

0

這裏是一個Java版本,提取單和多行註釋(未進行詳盡測試)。

public void showComments(String fileName) { 
    StringBuffer sb = new StringBuffer(); 
    FileReader br = null; 
    try { 
     br = new FileReader(fileName); 

     int ch = -1; 
     boolean singleLineComment = false; 
     boolean multiLineComment = false; 
     char prev = (char)ch; 
     while ((ch = br.read()) != -1) { 
      if (ch == '/' && prev == ch && !singleLineComment) { 
       singleLineComment = true; 
      } else if (ch == '*' && prev == '/' && !multiLineComment) { 
       multiLineComment = true; 
      } else if (ch == '\n' && singleLineComment) { 
       System.out.println(sb.toString()); 
       singleLineComment = false; 
       sb = new StringBuffer(); 
      } else if (ch == '/' && prev == '*' && multiLineComment) { 
       System.out.println(sb.toString()); 
       multiLineComment = false; 
       sb = new StringBuffer(); 
      } else if (multiLineComment || singleLineComment) { 
       sb.append((char)ch); 
      } 
      prev = (char)ch; 
     } 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
}