C语言去除注释

Removing comments in C language

我需要编写一个可以从文件中删除评论的程序。删除标准注释非常简单。但是,我还没有想出一种方法来删除“带连字符的”评论。例如,前两行代码是注释。我的程序不理解这一点,只删除了注释的第一行。

// Function for output to console\
    ns2

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <iso646.h>

int main() {
    FILE *in = fopen("inp.c", "r");
    FILE *out = fopen("out.c", "w");
    char ch;
    while ((ch = fgetc(in)) not_eq EOF) {
        if (ch == '/') {
            int flag_1 = 0;
            ch = fgetc(in);
            if (ch == '/') {
                flag_1 = 1;
                while ((ch = fgetc(in)) not_eq '\n') {
                    ch = fgetc(in);
                    if (ch == '\') {
                        ch = '\n'; 
                        break;
                    }
                }
                ch = '\n';
            }
            else if (ch == '*') {
                flag_1 = 1;
                while ((ch = fgetc(in)) not_eq EOF) {
                    if ((ch = fgetc(in)) == '*' and (ch = fgetc(in)) == '/') {
                        ch = '\n';
                        break;
                    }
                }
            }
            if (flag_1 == 0)
                fputc('/', out);
        }
        if (ch == '"') {
            fputc(ch, out);
            while ((ch = fgetc(in)) not_eq '"') {
                fputc(ch, out);
            }
        }
        fputc(ch, out);
    }
    fclose(in);
    fclose(out);
    return 0;
}

一个多小时以来,我一直在尝试补充/更改程序,但初学者的知识不允许我掌握这项任务。我很乐意听取您的建议!

为了忽略转义的换行符,即 \ 后跟换行符的序列,您可以使用透明处理此问题的函数。

还要注意这些问题:

  • ch 必须定义为 int 才能正确处理 EOF
  • <iso646.h> 中定义的宏使代码的可读性降低。
  • \应该在解析字符串的时候处理
  • 字符常量也应该被解析:'//' 是一个有效的字符常量,不是注释。
// Function for output to console\
    ns2
/\
*\ This is a valid comment too :) 
*\
/

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>

int mygetc(FILE *in) {
    for (;;) {
        int c = getc(in);
        if (c == '\') {
            c = getc(in);
            if (c == '\n')
                continue;
            if (c != EOF)
                ungetc(c, in);
            c = '\';
        }
        return c;
    }
}

int skip_line_comment(FILE *in) {
    int c;
    while ((c = mygetc(in)) != '\n' && c != EOF)
        continue;
    return c;
}

int skip_block_comment(FILE *in) {
    int c;
    for (;;) {
        while ((c = mygetc(in)) != '*') {
            if (c == EOF)
                return c;
        }
        while ((c = mygetc(in)) == '*')
            continue;
        if (c == EOF)
            return c;
        if (c == '/')
            return ' ';
    }
}

int main() {
    FILE *in = fopen("inp.c", "r");
    FILE *out = fopen("out.c", "w");
    int ch;
    while ((ch = mygetc(in)) != EOF) {
        if (ch == '/') {
            ch = skip_line_comment(in);
        } else
        if (ch == '*') {
            ch = skip_block_comment(in);
        } else
        if (ch == '"' || ch == '\'') {
            int sep = ch;
            fputc(ch, out);
            while ((ch = mygetc(in)) != sep && ch != EOF) {
                fputc(ch, out);
                if (ch == '\') {
                    ch = mygetc(in);
                    if (ch == EOF)
                        break;
                    fputc(ch, out);
                }
            }
        }
        if (ch == EOF)
            break;
        fputc(ch, out);
    }
    fclose(in);
    fclose(out);
    return 0;
}