从文件中删除注释并将其打印在控制台上

时间:2017-01-29 10:02:04

标签: c

我编写了代码来删除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;
 }

有人可以指出代码中的错误。它似乎适用于引号内的评论。但不是单行注释。

1 个答案:

答案 0 :(得分:1)

rcomment()函数无法正确解析单行注释:

  • 如果您为第二个字符匹配'/',则应该读取换行符之前的所有剩余字符并仅输出换行符。

  • 如果第二个字符是引号,则无法输出第一个字符并解析文字。一种简单的方法是使用ungetc(d, fp);取消第二个字符,并仅输出c

您还有其他特殊情况需要处理:

  • 转义换行符应在文字和单行注释中处理,也应在多行注释开头的/*之间以及{{1}之间处理最后是*。您只需使用实用程序函数从处理转义换行符的文件中读取字节即可,但很难将它们输出回输出文件以保留行数。

  • 您应该使用单个空格或换行符替换多行注释,以避免粘贴令牌并保留行数。

  • /incomment()应该处理文件的过早结束。按照目前的编码,它们无限期地运行。

这个解析任务比它看起来更加微妙。您可以尝试另一种方法并实现状态机。

以下是echo_quote()功能的快速修复,但上述其他问题仍然存在:

rcomment()