我正在尝试编写一个程序来删除 C 程序中的所有注释。我相信这是大多数 C 书籍中的常见练习。 代码如下:
#include <stdio.h>
#include <conio.h>
#define ON 1
#define OFF 2
int main()
{
FILE* fs, * ft;
int c = 1, c_prev = 1, slcomment = OFF, mlcomment = OFF;
fs = fopen("source.c", "rb");
ft = fopen("target.c", "wb");
c_prev = fgetc(fs);
while ((c = fgetc(fs)) != EOF)
{
if (c_prev == '/')
{
if (c == '/')
slcomment = ON;
else if (c == '*')
mlcomment = ON;
else
fputc(c_prev, ft);
}
if (c == '\n' && slcomment == ON)
slcomment = OFF;
if (c_prev == '*' && c == '/' && mlcomment == ON)
{
mlcomment = OFF;
c = fgetc(fs);
}
if (c != '/' && mlcomment == OFF && slcomment == OFF)
fputc(c, ft);
c_prev = c;
}
fclose(fs);
fclose(ft);
printf("Program, after removal of comments, has been copied in target.c...\n");
getch();
return 0;
}
该程序似乎工作正常,只是当有单行注释时它无法删除第一个“/”。 我似乎无法弄清楚出了什么问题。错误之处请指出。先谢谢大家了。
从你的代码来看,问题不在第一个“/”上,而是在第二个“/”上。这是由这段代码引起的:
if (c_prev == '/')
{
if (c == '/')
slcomment = ON;
else if (c == '*')
mlcomment = ON;
else
fputc(c_prev, ft);
}
c_prev 是“/”,因为它是第二个字符。 c 可以是这里的任何内容,因为它来自注释行。然后它会到达 else 语句,该语句将插入 '/' 字符。
仅当 slcomment 和 mlcomment 关闭时才应调用此代码块。