我想将评论打印到要在控制台中打印的给定程序?
是否有任何功能和任何自己的逻辑来打印程序中的评论?
例如
int main()
{
/* this is a comment */
}
上面的程序只有一个评论我想通过某种逻辑或任何功能将此评论打印到控制台,如果在 C 中有的话?
我想将评论打印到要在控制台中打印的给定程序?
是否有任何功能和任何自己的逻辑来打印程序中的评论?
例如
int main()
{
/* this is a comment */
}
上面的程序只有一个评论我想通过某种逻辑或任何功能将此评论打印到控制台,如果在 C 中有的话?
您需要编写一个程序来读取 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);
}
}
无法访问其自己的源代码的已编译 C 程序将无法打印注释。注释被 C 预处理器删除,编译器甚至看不到。换句话说,一旦程序可执行,注释文本将不可用。
这就是为什么您的方法必须以某种方式直接处理源代码的原因,您不能在运行时为程序本身执行此操作。
也许你可以颠倒你的问题。为什么不使用字符串(可以打印)作为注释?评论的重点是
字符串文字具有这两个特征。
因此
void a_function()
{
docstring = "This string is a comment. Blah blah.";
printf("DOC %s", docstring);
}
(Python 有一个非常相似的约定,这就是我得到名称“docstring”的地方)。
这是一个 awk 脚本,可以从源代码文件中提取注释。
Refer to How can I delete all /* */ comments from a C source file? and then make a diff between the generated file and the original file.
我对这个问题很困惑,如果你想打印每条评论,为什么不直接使用字符串而不是评论呢?或两者?为什么需要打印程序的注释?只是想知道,因为我不确定你在这里想要做什么,也许有更好的方法来实现你想要做的事情。
不printf("/*foo*/");
工作还是什么?或者你是想让这个自动化吗?
如果是后者,那么您将需要让您的程序解析您的源文件并搜索注释(除非有其他更简单的神奇方法)。
我建议您只是逐个字符地读取 C 文件,直到遇到 a/*
并开始用每个字符填充一个数组,直到下一次出现*/
.
如果由于某种原因您遇到的问题是前者,并且由于某种原因您不能使用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;
}
祝你好运。
这是一种程序,称为Quine
C 示例:
main(){char *c="main(){char *c=%c%s%c;printf(c,34,c,34);}";printf(c,3
4,c,34);}
此代码可以处理单行注释。
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;
}
这是一个提取单行和多行注释的 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();
}
}
试试这个代码!
代码 :
#include <stdio.h>
int main()
{
char comment[25] ="/* this is a comment */";
printf("%s",comment);
return 0;
}
输出 :
/* 这是一条评论 */