注视转换 将C风格注释转换为C++风格

16 篇文章 0 订阅
1 篇文章 0 订阅

C注释风格:/* */
C++注释风格: //

主要便是

CommentConvert .h

#ifndef __COMMENT_H__
#define __COMMENT_H__

#include<stdio.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 DoNulState(FILE* pfIn, FILE* pfOut)
{
    int first = fgetc(pfIn);
    int second = 0;
    switch (first)
    {
    case '/':      
        second = fgetc(pfIn);
        if (second == '/')                           //C++注释
        {
            fputc(first, pfOut);
            fputc(second, pfOut);
            state = CPP_STATE; 
        }
        else if (second == '*')                        //C注释
        {
            fputc('/', pfOut);
            fputc('/', pfOut);
            state = C_STATE;
        }
        else
        {
            fputc(first, pfOut);
            fputc(second, pfOut);
        }
        break;
    case EOF:                                   //文件结束
        state = END_STATE;
        break;
    default:
        fputc(first, pfOut);
        break;
    }
}
void DoCState(FILE*pfIn, FILE* pfOut)
{
    int first = fgetc(pfIn);
    int second = 0;
    int third = 0;
    switch (first)
    {
    case '*':
        second = fgetc(pfIn);
        switch (second)
        {
        case '/':                 //C注释结束
            third = fgetc(pfIn);
            if (third != '\n')                          //如果后面没有换行符,则加一个换行符
            {
                fputc('\n', pfOut);
            }
            if (third == '/')                            
            {
                ungetc(third, pfIn);
                //字符返回函数:将读出的数据再次放回到缓冲区去,下一次读数据时,仍然读出来。
                state = NUL_STATE;
                break;
                //连续注释问题 /*  *//*  */
            }
            fputc(third, pfOut);
            state = NUL_STATE;
            break;
        case '*':
            fputc(first, pfOut);
            third = fgetc(pfIn);
            if (third == '/')
            {
                state = NUL_STATE;
            }
            break;
        default:
            fputc(first, pfOut);
        }
        break;
    case '\n':
        fputc(first, pfOut);
        fputc('/', pfOut);
        fputc('/', pfOut);
        break; 
    case EOF:
        state = END_STATE;
        break;
    default:
        fputc(first, pfOut);
        break; 
    }
}
void DoCppState(FILE* pfIn, FILE* pfOut)
{
    int first = fgetc(pfIn);
    switch (first)
    {
    case '\n':
        fputc(first, pfOut);
        state = NUL_STATE;
        break;
    case EOF:
        state = END_STATE;
        break;
    default:
        fputc(first, pfOut);
        break;
    }
}

void DoConvertWork(FILE* pfIn, FILE* pfOut)
{
    while (state != END_STATE)
    {
        switch (state)
        {
        case C_STATE:
            DoCState(pfIn, pfOut);
            break;
        case CPP_STATE:
            DoCppState(pfIn, pfOut);
            break;
        case NUL_STATE:
            DoNulState(pfIn, pfOut);
            break;
        default:
            break;
        }
    }
}

test .c

#define _CRT_SECURE_NO_WARNINGS 1 

#include"CommentConvert.h"

int main()
{
    FILE *fRead = NULL;
    FILE *fWrite = NULL;
    printf("注释转换开始\n");
    fRead = fopen("input.c", "r");
    if (fRead == NULL)
    {
        perror("open file for read");
    }
    fWrite = fopen("output.c", "w");
    if (fWrite == NULL)
    {
        fclose(fRead);
        perror("open file for write");
    }

    DoConvertWork(fRead, fWrite);
    fclose(fRead);
    fclose(fWrite);
    printf("注释转换结束\n");
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值