注释转换项目

一个小的注释转换项目
我们要将c语言的注释(/**/)全部转换成c++(//)样子的!!
画张图我们就了解了整个流程

这里写图片描述

convert.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

#ifndef __CONVERT_H__
#define __CONVERT_H__



enum{EOFSTAT,CPPSTAT,NULSTAT,CSTAT};//定义了一个枚举常量

#endif

main.c

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"convert.h"



int main()
{
    convert_main();//调用convert_main函数
    system("pause");
    return 0;
}

convert.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"convert.h"

#define INPUT "input.c"
#define OUPUT "output.c"

static int status = NULSTAT;
/*只要读到的字符不确定是什么,就将字符直接退回文件用ungetc函数*/

void do_cpp_stat(FILE *ipf, FILE *opf)//  //进入c++状态
{
    int c = fgetc(ipf);
    switch (c)
    {
        case '\n'://如果后面读到一个\n,则依旧是无注释状态
        {
            fputc('\n',opf);//输出一个换行
            status = NULSTAT;
        }break;
        case EOF:
            status = EOFSTAT;
            break;
        default:
            fputc(c, opf);//如果为其他的则依旧为c++状态
            status = CPPSTAT;
            break;
    }

}

void do_null_stat(FILE *ipf, FILE *opf)//当为无注释状态时
{
    int c = fgetc(ipf);//读取的第一个字符
    switch (c)
    {
    case'/'://如果是'/'
    {
               int s = fgetc(ipf);//读取的下一个字符
               switch (s)
               {
               case '/'://下一个字符如果是'/'则进入c++状态
               {
                           fputc(c, opf);
                           fputc(s, opf);
                           status = CPPSTAT;
               }break;
               case'*'://如果是*则进入c语言状态
               {
                          fputc(c, opf);
                          fputc('/', opf);
                          status = CSTAT;
               }break;
               case EOF://如果是EOF则结束转换
                   status = EOFSTAT;
                   break;
               default://如果都不是则为除号则依旧在无注释状态
                   fputc(c, opf);
                   ungetc(s, ipf);
                   status = NULSTAT;
                   break;
               }
    }break;
    case EOF:
        status = EOFSTAT;
        break;
    default:
        fputc(c, opf);
        status = NULSTAT;
        break;
    }
}

void do_c_stat(FILE *ipf, FILE *opf)//    读取到一个/*进入到该状态
{
    int c = fgetc(ipf);//继续读取字符
    switch (c)
    {   
    case'\n'://当读取到\n时
    {
                fputc('\n', opf);//输出\n换行后继续输出//
                fputc('/', opf);
                fputc('/', opf);
    }break;
        case'*':
        {
                   int s = fgetc(ipf);//读取的下一个字符
                   switch (s)
                   {
                   case'/'://此时应为注释结束状态,再读取一个字符判断后面还有没有语句如有语句输出‘\n'
                       //转换到无注释状态,若后面直接是'\n'直接输出
                   {
                              int n = fgetc(ipf);
                              if (n != '\n')
                              {
                                  ungetc(n, ipf);
                                  fputc('\n', opf);
                                  status = NULSTAT;
                              }
                              else
                              {
                                  fgetc('\n', opf);
                                  status = NULSTAT;
                              }
                    } break;
                   case EOF:
                       status = EOFSTAT;
                       break;
                   default://若为其他则依旧为c语言状态
                       fputc(c, opf);
                       ungetc(s, ipf);
                       status = CSTAT;
                       break;
                    }
        }break;

        case EOF:
            status = EOFSTAT;
            break;
        default:
            fputc(c, opf);
            status = CSTAT;
            break;
    }
}

void do_eof_work(FILE *ipf, FILE *opf)
{
    int f = fgetc(ipf);
    fputc(f, opf);
}

static void convert_work(FILE *ipf, FILE *opf)
{
    while (status!=EOFSTAT)//status为一个全局变量为当前程序的状态:四种状态分别为无注释状态,c语言/* 状态,c++状态 //,文件结尾状态
    {
        switch (status)
        {
        case CSTAT://c语言状态
            do_c_stat(ipf,opf);
            break;
        case NULSTAT://无注释状态
            do_null_stat(ipf, opf);
            break;
        case CPPSTAT://c++状态
            do_cpp_stat(ipf, opf);
            break;
        case EOFSTAT:
            //do_eof_work(ipf, opf);
            break;
        default:
            break;
        }
    }
}
void convert_main()
{
    FILE *ipf = fopen(INPUT, "r");//以只读方式打开
    FILE *opf = fopen(OUPUT, "w");//以只写方式打开
    if (ipf == NULL || opf == NULL)
    {
        printf("open file fail!!",stderr);//如果有一个文件指针为NULL则打开文件失败
        exit(1);
    }
    else
    {
        convert_work(ipf, opf);//调用convert_work函数
    }

    fclose(ipf);
    fclose(opf);

}

互相交流互相学习!!要是有什么错误希望可以及时指出^-^!!!万分感谢!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值