You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C文件注释清除程序开发问题求助(附代码与测试结果)

工作目的:学习使用标准C库函数进行文件操作
任务

现有一个包含C程序的文件test.c,需删除其中所有注释并将无注释代码写入新文件test.wc。

实现说明与特性要求
  • 程序文件可能极大,禁止预先将整个文件读入数组;
  • 注释分为单行或多行,单行注释可通过反斜杠\换行延续;
  • C语言无嵌套注释;
  • 字符串常量内的注释不予处理;
  • 文件不一定是合法C程序,比如注释可能未闭合;
  • 删除注释的位置可替换为少量空格/换行,或移除无关分隔符;
  • 不得删除双引号、单引号标记的常量字符串内容。
现有代码
#include <stdio.h>

#define TRUE 1
#define FALSE 0

typedef int BOOL;

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 ' ';
        }
}

void removeComments (FILE *in, FILE *out) {
        int c;
        while ((c = mygetc(in)) != EOF) {
                if (c == '"' || c == '\'') {
                        int separator = c;
                        fputc(c, out);
                        while ((c = mygetc(in)) != separator && c != EOF) {
                                fputc(c, out);
                                if (c == '\\') {
                                        c = mygetc(in);
                                        if (c == EOF) break;
                                        fputc(c, out);
                                }
                        }
                } else if (c == '/') {
                        c = mygetc(in);
                        if (c == '/') c = skip_line_comment(in);
                        else if (c == '*') c = skip_block_comment(in);
                        else fputc('/', out);
                        
                }
                if (c == EOF) break;
                fputc(c, out);
        }
}

int main () {
        const char inName[20]  = "test.c";
        const char outName[20] = "test.wc";
        FILE *in;
        FILE *out;
  
        in  = fopen(inName, "r");
        out = fopen(outName, "w");
       
        removeComments(in, out);

        fclose(in);
        fclose(out);
  
        return 0;
}
测试情况

测试用例共13个,其中Test3(首行缺失"/")、Test4(期望"* * *"单行却分行)、Test6(字符串常量处理异常)、Test8(多余行被移除)、Test9/10("/"与"\"组合处理问题)未通过,其余测试用例正常。

求助需求

现寻求技术支持,解决上述测试未通过的问题,完善代码以满足所有需求。

内容的提问来源于stack exchange,提问作者rvevau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 03:00:57