我编写了代码来删除C程序文件中的注释,并在控制台上打印输出:
#include <stdio.h>
#include <stdlib.h>
void incomment(FILE *fp);
void rcomment(int c, FILE *fp);
void echo_quote(int c, FILE *fp);
int main() {
FILE *fp;
fp = fopen("temp.c", "r");
int c;
while ((c = getc(fp)) != EOF) {
rcomment(c, fp);
}
return 0;
}
void incomment(FILE* fp) {
int c, d;
c = getc(fp);
d = getc(fp);
while (c != '*' && d != '/') {
c = d;
d = getc(fp);
}
}
void echo_quote(int c, FILE *fp) {
int d;
putchar(c);
while ((d = getc(fp)) != c) {
putchar(d);
if (d == '\\')
putchar(getc(fp));
}
putchar(d);
}
void rcomment(int c, FILE *fp) {
int d;
if (c == '/') {
if ((d = getc(fp)) == '*')
incomment(fp);
else
if (d == '/') {
putchar(c);
rcomment(d, fp);
} else {
putchar(c);
putchar(d);
}
} else
if (c == '\'' || c == '"')
echo_quote(c, fp);
else
putchar(c);
}
但是对于以下输入:
#include<stdio.h>
/* Author : XYZ
* Date : 21/1/2016
*/
int main()
{
int a; // / variable a
printf("/*Hi*/");
return 0;
}
输出:
#include<stdio.h>
Date : 21/1/2016
*/
int main()
{
int a; // / variable a
printf("/*Hi*/");
return 0;
}
有人可以指出代码中的错误。它似乎适用于引号内的评论。但不是单行注释。
答案 0 :(得分:1)
rcomment()
函数无法正确解析单行注释:
如果您为第二个字符匹配'/'
,则应该读取换行符之前的所有剩余字符并仅输出换行符。
如果第二个字符是引号,则无法输出第一个字符并解析文字。一种简单的方法是使用ungetc(d, fp);
取消第二个字符,并仅输出c
。
您还有其他特殊情况需要处理:
转义换行符应在文字和单行注释中处理,也应在多行注释开头的/
和*
之间以及{{1}之间处理最后是*
。您只需使用实用程序函数从处理转义换行符的文件中读取字节即可,但很难将它们输出回输出文件以保留行数。
您应该使用单个空格或换行符替换多行注释,以避免粘贴令牌并保留行数。
/
和incomment()
应该处理文件的过早结束。按照目前的编码,它们无限期地运行。
这个解析任务比它看起来更加微妙。您可以尝试另一种方法并实现状态机。
以下是echo_quote()
功能的快速修复,但上述其他问题仍然存在:
rcomment()