尝试编写一个C程序来删除C程序中的所有注释

问题描述 投票:0回答:1

我正在尝试编写一个程序来删除 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;
}

该程序似乎工作正常,只是当有单行注释时它无法删除第一个“/”。 我似乎无法弄清楚出了什么问题。错误之处请指出。先谢谢大家了。

c comments
1个回答
0
投票

从你的代码来看,问题不在第一个“/”上,而是在第二个“/”上。这是由这段代码引起的:

if (c_prev == '/')
{
    if (c == '/')
        slcomment = ON;
    else if (c == '*')
        mlcomment = ON;
    else
        fputc(c_prev, ft);
}

c_prev 是“/”,因为它是第二个字符。 c 可以是这里的任何内容,因为它来自注释行。然后它会到达 else 语句,该语句将插入 '/' 字符。

仅当 slcomment 和 mlcomment 关闭时才应调用此代码块。

© www.soinside.com 2019 - 2024. All rights reserved.