c/c++注释转换

C语言与c++有着不同的注释方式,所以我进行了将c的注释转换成c++的注释

CommentConvert.h文件
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __COMMENT_H__
#define __COMMENT_H__
#include <stdio.h>
#include <stdlib.h>
enum STATE
{
    NUL_STATE,
    C_STATE,
    CPP_STATE,
    END_STATE
};
void DoCState(FILE* pfIn, FILE* pfOut);
void DoCppState(FILE* pfIn, FILE* pfOut);
void DoNulState(FILE* pfIn, FILE* pfOut);
void DoConvertWork(FILE* pfIn, FILE* pfOut);

#endif //__COMMENT_H__
CommentConvert.c文件
#define _CRT_SECURE_NO_WARNINGS 1

#include "CommentConvert.h"

static enum STATE state = NUL_STATE;
void DoConvertWork(FILE* pfIn, FILE* pfOut)
{
    while (state != END_STATE)
    {
        switch (state)
        {
        case NUL_STATE:
            DoNulState(pfIn, pfOut);
            break;
        case C_STATE:
            DoCState(pfIn, pfOut);
            break;
        case CPP_STATE:
            DoCppState(pfIn, pfOut);
            break;
        default:
            break;
        }
    }
}
void CommentConvert()
{
    FILE* pfWrite = NULL;
    FILE* pfRead = NULL;
    pfRead = fopen("input.c", "r");

    if (pfRead == NULL)
    {
        perror("open file for read");
        return;
    }
    pfWrite = fopen("output.c", "w");
    if (pfWrite == NULL)
    {
        perror("open file for write");
        fclose(pfRead);
        return;

    }

    DoConvertWork(pfRead, pfWrite);
    fclose(pfRead);
    fclose(pfWrite);
}
void DoNulState(FILE* pfIn, FILE* pfOut)
{
    int first = fgetc(pfIn);
    switch (first)
    {
    case '/':
    {
                int second = fgetc(pfIn);
                switch (second)
                { 
                case '*':
                    fputc(first, pfOut);
                    fputc('/', pfOut);
                    state = C_STATE;
                    break;
                case'/':
                    fputc(first, pfOut);
                    fputc('/', pfOut);
                    state = CPP_STATE;
                    break;
                case EOF:
                    fputc(first, pfOut);
                    state = END_STATE;  
                    break;
                default:
                    fputc(first, pfOut);
                    fputc(second, pfOut);
                }
    }
        break;
    case EOF:
        fputc(first, pfOut);
        state = END_STATE;
        break;
    default:
        fputc(first, pfOut);
        break;
    }
}

void DoCState(FILE* pfIn, FILE* pfOut)
{
    int first = fgetc(pfIn);
    int second = 0;
    switch (first)
    {
    case '*':
         second = fgetc(pfIn);
            if (second == '/')
            {
                int third = fgetc(pfIn);
                state = NUL_STATE;
                if (third != '\n')
                {
                    fputc('\n', pfOut);
                    ungetc(third, pfIn);//将已读数据还给缓冲区 

                }
                if (third == '\n')
                {
                    fputc(third, pfOut);
                }
            }
            else
            {
                fputc(first, pfOut);
                ungetc(second, pfIn);//将*之后的内容还回缓冲区;  
            }
        break;

    case '\n'://换行,连续注释,就将下一行开头加入Cpp注释;  
        fputc(first, pfOut);
        fputc('/', pfOut);
        fputc('/', pfOut);
        break;
    case EOF:
        fputc(first, pfOut);
        state = END_STATE;
        break;
    default:
        fputc(first, pfOut);
        break;
    }
}
void DoCppState(FILE* pfIn, FILE* pfOut)
{
    int first = fgetc(pfIn);

    switch (first)
    {
    case'\n'://Cpp注释的换行就是一行注释的结束;  
        fputc(first, pfOut);
        state = NUL_STATE;
        break;
    case EOF:
        fputc(first, pfOut);
        state = END_STATE;
        break;
    default:
        fputc(first, pfOut);
        break;
    }
}
test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentConvert.h"

void test()
{
    CommentConvert();
}
int main()
{

    test();
    system("pause");
    return 0;
}

结果对比如下:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值