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
相关产品推荐
相关产品推荐

