C注释转换为C++注释小项目

项目要求:

将源文件中C语言注释(/**/)转换为C++注释(//),其它内容不变。

思路框图:
这里写图片描述


测试用例:

input.c
这里写图片描述
在工程路径下建立文件

这里写图片描述

源码实现:


test.c

#include"comment_convert.h"

void test()//测试函数
{
    FILE *pfread = NULL;
    FILE *pfwrite = NULL;
    pfread = fopen(IN_FILENAME, "r");//打开“input.c”
    if (pfread == NULL)
    {
        perror("Open reaf file failure");
        exit(EXIT_FAILURE);
    }
    pfwrite = fopen(OUT_FILENAME, "w");//打开“output.c”
    if (pfwrite == NULL)
    {
        perror("Open write file failure");
        fclose(pfread);
        exit(EXIT_SUCCESS);
    }

    DoComment_convert(pfread, pfwrite);//转换函数

    fclose(pfread);//关闭“input.c”
    fclose(pfwrite);//关闭“output.c”
}

int main()//主函数
{
    test();
    return 0;
}

comment_convert.h

#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__

#define _CRT_SECURE_NO_WARNINGS 1

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


#define IN_FILENAME "input.c"//所要转换文件名
#define OUT_FILENAME "output.c"//转换后文件名

typedef enum STATE//枚举类型,每个常量代表一种状态
{
    NUL_STATE,//空状态
    C_STATE,//C状态
    CPP_STATE,//C++状态
    END_STATE//结束状态
} STATE;


Do_nul(FILE *pfin, FILE *pfout, STATE *tmp);//空状态处理函数
Do_c(FILE *pfin, FILE *pfout, STATE *tmp);//C注释状态处理函数
Do_cpp(FILE *pfin, FILE *pfout, STATE *tmp);//C++注释处理函数

void DoComment_convert(FILE *pfin, FILE *pfout);//转换函数

#endif//__COMMENT_CONVERT_H__

comment_convert.c

#include"comment_convert.h"



Do_nul(FILE *pfin, FILE *pfout, STATE *tmp)//空状态处理函数
{
    int first = 0;
    first = fgetc(pfin);
    switch (first)
    {
    case '/':
    {
                int second = 0;
                second = fgetc(pfin);
                switch (second)
                {
                case '*':
                    fputc(first, pfout);
                    fputc(first, pfout);
                    *tmp = C_STATE;
                    break;
                case '/':
                    fputc(second, pfout);
                    fputc(second, pfout);
                    *tmp = CPP_STATE;
                    break;
                }
    }
        break;
    case EOF:
        *tmp = END_STATE;
        break;
    default:
        fputc(first, pfout);
        break;
    }
}
Do_c(FILE *pfin, FILE *pfout, STATE *tmp)//C注释状态处理函数
{
    int first = 0;
    first = fgetc(pfin);
    switch (first)
    {
    case '*':
    {
                int second = 0;
                second = fgetc(pfin);
                switch (second)
                {
                case '/':
                {
                            int third = 0;
                            third = fgetc(pfin);
                            switch (third)
                            {
                            case '\n':
                                fputc(third, pfout);
                                *tmp = NUL_STATE;
                                break;
                            case '/':
                            {
                                        int fourth = 0;
                                        fourth = fgetc(pfin);
                                        switch (fourth)
                                        {
                                        case '/':
                                            *tmp = CPP_STATE;
                                            break;
                                        case '*':
                                            //*tmp = C_STATE;
                                            break;
                                        default:
                                            fputc('\n', pfout);
                                            fputc(third, pfout);
                                            fputc(fourth, pfout);
                                            *tmp = NUL_STATE;
                                            break;
                                        }
                            }
                                break;
                            default:
                                fputc('\n', pfout);
                                fputc(third, pfout);
                                *tmp = NUL_STATE;
                                break;
                            }
                }
                    break;
                default:
                    fputc(first, pfout);
                    ungetc(second, pfin);
                    break;
                }
    }
        break;
    case '\n':
        fputc(first, pfout);
        fputc('/', pfout);
        fputc('/', pfout);
        break;
    case EOF:
        *tmp = END_STATE;
        break;
    default:
        fputc(first, pfout);
        break;
    }
}
Do_cpp(FILE *pfin, FILE *pfout, STATE *tmp)//C++注释处理函数
{
    int first = 0;
    first = fgetc(pfin);
    switch (first)
    {
    case '\n':
        fputc(first, pfout);
        *tmp = NUL_STATE;
        break;
    case EOF:
        *tmp = END_STATE;
        break;
    default:
        fputc(first, pfout);
        break;
    }
}



void DoComment_convert(FILE *pfin, FILE *pfout)//转换函数
{
    STATE state = NUL_STATE;
    while (state != END_STATE)
    {
        switch (state)
        {
        case NUL_STATE:
            Do_nul(pfin,pfout,&state);
            break;
        case C_STATE:
            Do_c(pfin, pfout, &state);
            break;
        case CPP_STATE:
            Do_cpp(pfin, pfout, &state);
            break;
        case END_STATE:
            break;
        }
    }
    printf("转换完成!\n");
}

结果贴图:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值