C语言小项目--注释转换

本文介绍了一个C语言小项目,旨在将C风格的注释转换为C++风格。通过使用fgetc()和fputc()函数,读取input.c文件内容,逐个字符处理并转换,最终将结果保存至output.c。项目包含main.c、comment.h和convert.c三个文件,实现了注释的转换。运行结果展示项目成功完成,欢迎在评论区分享更多转换方法。
摘要由CSDN通过智能技术生成

这里所说的注释转换是指将C风格的注释转换成C++风格的注释。那么我们如何来实现这个目的呢?
首先我们得有一个名为 input.c 的文件 ,里面写着一段C风格的注释和一些代码。而我们转换后的注释及代码应该保存在一个名为 output.c 的文件里。要将 input.c中的内容转换,我们就得将该文件中的内容一个一个取出,一边取一边转换,这里我们需要用到 fgetc()和fputc()这两个库函数。那么我们该如何转换呢,我们就得画出转换图:
这里写图片描述

画出状态转换图后,我们就可以开始进行代码的编写了。

首先创建一个main.c 文件
代码如下:

#include<stdio.h>
#include"comment.h"
int main()
{   
    convert_main();
    return 0;   
}

接下来创建一个名为comment.h的头文件

#ifndef __COMMENT_H__
#define __COMMENT_H__
#define INPUTFILE "input.c"//输入文件
#define OUTPUTFILE "output.c"//转换后的输出文件
enum 
{
    CSTATUS,
    CPPSTATUS,
    NULLSTATUS,
    EOFSTAUS
};
void convert_main();
#endif

最后再创建一个convert.c 文件,主要实现convert_main()函数

#include<stdio.h>
#include<stdlib.h>
#include"comment.h"

//初始状态为普通模式
int status = NULLSTATUS;
//在普通模式下 
void do_null_status(FILE * ifp, FILE* ofp)
{
    int c = fgetc(ifp);
    switch (c)
    {
    case'/':
    {
        int s = fgetc(ifp);
        switch (s)
        {
        case'*':
            fputc('/', ofp);
            fputc('/', ofp);
            status = CSTATUS;
            break;
        case'/':
            fputc(c, ofp);
            fputc(s, ofp);
            status = CPPSTATUS;
            break;
        case EOF:
            status = EOFSTAUS;
            break;
        default:        
            fputc(c, ofp);
            ungetc(s, ifp);
            status = NULLSTATUS;
            break;
        }

    }
        break;
    case EOF:
        status = EOFSTAUS;
        break;
    default:        
        fputc(c, ofp);
        status = NULLSTATUS;
        break;
    }

}

//在C注释模式下
void do_c_status(FILE *ifp, FILE *ofp)
{
    int c = fgetc(ifp);
    switch (c)
    {
    case'*':
    {
        int s = fgetc(ifp);
        switch (s)
        {
        case'/':
            fputc('\n', ofp);
            status = NULLSTATUS;
            break;
        default:
            fputc(c, ofp);
            ungetc(s, ifp);
            status = CSTATUS;
            break;
        }
    }
    break;
    case'\n':
        fputc(c, ofp);
        fputc('/', ofp);
        fputc('/', ofp);
        status = CSTATUS;
        break;
    case EOF:
        status = NULLSTATUS;
        break;
    default:
        fputc(c, ofp);
        break;
    }

}
//在C++注释下
void do_cpp_status(FILE *ifp, FILE *ofp)
{
    int c = fgetc(ifp);
    switch (c)
    {
    case'\n':
        fputc(c, ofp);
        status = NULLSTATUS;
        break;
    case EOF:
        status = NULLSTATUS;
        break;
    default:
        fputc(c, ofp);
        break;
    }
}
static void convert_work(FILE *ifp, FILE * ofp)
{
    while (status != EOFSTAUS)
    {
        switch (status)
        {
        case NULLSTATUS:
            do_null_status(ifp,ofp);
            break;
        case CPPSTATUS:
            do_cpp_status(ifp,ofp);
            break;
        case CSTATUS:
            do_c_status(ifp,ofp);
            break;
        case EOFSTAUS:
            break;
        default:
            break;
        }
    }
}


void convert_main()
{
    FILE * ifp = fopen(INPUTFILE, "r");
    FILE * ofp = fopen(OUTPUTFILE, "w");
    if (ifp == NULL&&ofp == NULL)
    {
        fprintf(stdout,"open error");
        return;
    }
    convert_work(ifp, ofp);
    fclose(ifp);
    fclose(ofp);
}

最后运行结果:
这里写图片描述

这里写图片描述

以上就是,注释转换这个小项目的实现,如有更好的方法,请在评论区中交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值