gpt4 book ai didi

c - 从 C 程序中删除注释

转载 作者:行者123 更新时间:2023-12-04 09:22:18 26 4
gpt4 key购买 nike

以下是我从 C 程序中删除注释的代码。但是注释行不会被删除。它删除了 /**/,但没有删除这两个分隔符之间的句子。

#include <stdio.h>

main(int argc, char *argv[]) {
FILE *fp, *ft;
char ch;
if (argc < 3) {
printf("No file name given");
}
fp = fopen(argv[1], "r");
ft = fopen(argv[2], "w");
if (fp == NULL)
printf("Opening error");
if (ft == NULL)
printf("Opening error");
while (1) {
ch = fgetc(fp);
if (ch == EOF)
break;
if (ch == '/') {
ch = fgetc(fp);
if (ch == '*') {
putc(' ', ft);
}
} else if (ch == '*') {
ch = fgetc(fp);
if (ch == '/') {
putc(' ', ft);
}
} else {
putc(ch, ft);
}
}
fclose(fp);
fclose(ft);
}

请帮我删除评论行。

最佳答案

您的代码中存在多个问题:

  • 不应省略main 的返回类型。隐式 int 已过时,C 标准不再允许。原型(prototype)应该是 int main(int argc, char *argv[])
  • 如果命令行参数没有传递给程序,它应该在打印错误消息后退出,错误消息应该输出到 stderr 而不是 stdout
  • 如果无法打开输入文件,则程序不应创建输出文件。
  • 如果 fopen 失败,程序应该停止而不是徘徊在未定义行为的领域。
  • ch 必须具有类型 int 而不是 char 才能使测试 (ch == EOF) 正常运行正确。
  • 您正确识别了序列 /**/ 并将它们替换为单个 ,但它实际上会删除所有其他出现的/* 以及后续字符,您没有任何规定可以跳过中间的字符。
  • main 应该返回 0

另请注意,如果序列 /**/ 出现在单行注释或字符串或字符常量中,您的方法可能无法正确识别注释。此外,您还应该处理转义的换行符(\ 在一行的末尾),因为它们可能出现在 /* 之间,隐藏注释开始或结束序列。

这是处理这些情况的修改版本:

#include <stdio.h>

/* read the next byte from the C source file, handing escaped newlines */
int getcpp(FILE *fp) {
int ch;
while ((ch = getc(fp)) == '\\') {
if ((ch = getc(fp)) != '\n') {
ungetc(ch, fp);
return '\\';
}
}
return ch;
}

/* read and write character and string constants */
int skipstr(int cch, FILE *fp, FILE *ft) {
int ch;
putc(cch, ft);
while ((ch = getcpp(fp)) != EOF) {
putc(ch, ft);
if (ch == cch)
return 0;
if (ch == '\\') {
if ((ch = getcpp(fp)) == EOF)
return EOF;
putc(ch, ft);
}
}
return EOF;
}

int main(int argc, char *argv[]) {
FILE *fp, *ft;
int ch;

if (argc < 3) {
fprintf(stderr, "Missing arguments. Need input and output filenames\n");
return 1;
}
if ((fp = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Cannot open input file %s\n", argv[1]);
return 1;
}
if ((ft = fopen(argv[2], "w")) == NULL) {
fprintf(stderr, "Cannot open output file %s\n", argv[2]);
return 1;
}
while ((ch = getcpp(fp)) != EOF) {
if (ch == '\'' || ch == '"') {
if (skipstr(ch, fp, ft)) {
fprintf(stderr, "unterminated string or character constant\n");
break;
}
continue;
}
if (ch == '/') {
if ((ch = getcpp(fp)) == '*') {
/* multi-line comment */
int lastc = 0;
while ((ch = getcpp(fp)) != EOF) {
if (ch == '/' && lastc == '*') {
break;
}
lastc = ch;
}
if (ch == EOF) {
fprintf(stderr, "unterminated comment\n");
break;
}
ch = ' ';
} else if (ch == '/') {
/* single-line comment */
while ((ch = getcpp(fp)) != EOF && ch != '\n')
continue;
if (ch == EOF)
break;
} else {
putc('/', ft);
}
}
putc(ch, ft);
}
fclose(fp);
fclose(ft);
return 0;
}

关于c - 从 C 程序中删除注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24603400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com