如何在给定的程序中打印注释?

时间:2012-08-28 12:17:11

标签: c

我想将评论打印到要在控制台中打印的给定程序吗?

是否有任何功能和任何自己的逻辑可以在程序中打印注释?

e.g。

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

上面的程序只有一个注释我想通过某个逻辑或任何函数将此注释打印到控制台,如果有C?

10 个答案:

答案 0 :(得分: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);
  }
}

答案 1 :(得分:4)

无法访问自己的源代码的已编译C程序将无法打印注释。 C预处理器删除了注释,编译器甚至从未看到过。换句话说,一旦程序可执行,注释文本就不可用。

这就是为什么你的方法必须以某种方式直接处理源代码的原因,你不能在运行时为程序本身做这个。

答案 2 :(得分:1)

This是一个awk脚本,可以从源代码文件中提取注释。

答案 3 :(得分:1)

也许你可以反驳你的问题。为什么不使用字符串(可以打印)作为注释?评论的意思是

  • 他们可以保留相当自由格式的文字。
  • 人们可以在查看源代码时阅读它。

字符串文字具有这两种特征。

因此

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

(Python有very similar convention,这就是我的名字“docstring”。

答案 4 :(得分:0)

请参阅How can I delete all /* */ comments from a C source file?,然后在生成的文件和原始文件之间进行差异。

答案 5 :(得分: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)

答案 6 :(得分:0)

我对这个问题非常困惑,如果你想打印每条评论,为什么不只是使用字符串而不是注释?或两者?为什么需要打印程序的注释?只是想知道,因为我不确定你在这里要做什么,也许有更好的方法来实现你想要做的事情。

printf("/*foo*/");不起作用吗?或者你想让它自动化?

如果是后者,则需要让程序解析源文件并搜索注释(除非有其他更简单的魔法方式)。

我建议您只读取C文件char by char,直到遇到/*并开始用每个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;
}
祝你好运。

答案 7 :(得分: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();
    }
}

答案 8 :(得分:0)

此代码可以处理单行注释。

  while((scanf("%c",&s[i]))!=EOF)
        {
            b[i]=s[i];
           if(s[i]=='\n')
            {
                for(j=k; j<=i; j++)
                {
                    if(s[j]=='/')
                    {
                        if(s[j+1]=='/')
                        {
                            temp=1;

                        }
                        else if(s[j+1]=='*')
                        {
                            for(j=j+2; j<=i; j++)
                            {
                                if(s[j]=='*')
                                {
                                    if(s[j+1]=='/')
                                    {
                                        temp=1;
                                    }
                                }
                            }
                        }
                        printf("%c",s[j]);
                        k=j;
                    }
                }
                printf("===");
                if(temp==1)
                {

                    printf("This Line has been commented :( \n");
                    temp=0;
                }
                else
                {
                    printf("this line is  code :) \n");
                }
            }

            i++;

        }
        return 0;
    }

答案 9 :(得分:0)

试试这段代码!

代码:

#include <stdio.h>
int main()
{

   char comment[25] ="/* this is a comment */";
   printf("%s",comment);
    return 0;
}

输出

/ *这是评论* /