注释转换

来源:互联网 发布:navicat linux 安装 编辑:程序博客网 时间:2024/05/19 22:51

我们编译的代码一般会有四种状态:正常代码. c风格的注释. c++风格的注释. EOF。
梳理一下文件的内容,简单包含以下几部分,它们间的关系如下图:!这里写图片描述

注释转换的原理

C++风格注释不变(//)C风格注释改成C++风格注释(/*  */————————//)

弄清楚转换关系,下面编写代码来实现注释的转换。

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include"convert.h"static int status = NULLSTAT;void do_null_stat (FILE *ipf,FILE *opf)//状态为普通时的处理{    int c = fgetc(ipf);    switch (c)    {        case'/'://   /* */    //    a/b        {                   int s = fgetc (ipf);                   switch (s)                   {                       case'*':                       {                                              fputc ('/',opf);//  将/*转成//的注释风格                                   fputc ('/',opf);                                   status = CSTAT;                                   break;                       }                       case'/':                       {                                  fputc ('/',opf);                                  fputc ('/',opf);                                  status = CPPSTAT;                                  break;                       }                       case EOF:                       status = EOFSTAT;                       break;                       default://   a/b                       {                                   fputc (c,opf);                                   ungetc(s,ipf);// 将/后面的东西退回给文件中                                   status = NULLSTAT;                                   break;                       }                   }        }            break;        case EOF:        status = EOFSTAT;        break;        default:            fputc (c,opf);        break;    }}void do_cpp_stat (FILE *ipf,FILE *opf)//  C++风格注释{    int a= fgetc (ipf);  //  获取//后的第一个字符    switch (a)    {        case'\n':  //如果是\n,换行。注释结束(转成正常状态)        {                    fputc (a,opf);                    status = NULLSTAT;                    break;        }        case EOF:        status = EOFSTAT;        break;        default:// 不换行也不是EOF ,那么输出后面的字符。        {                   fputc (a,opf);                   status = NULLSTAT;                   break;         }    }}void do_c_stat (FILE *ipf,FILE *opf)//   /*风格注释    /*  * */     /* dgh */   /*  注释好几行*/{    int f = fgetc(ipf);  //提取/*后第一个字符     switch (f)    {        case'\n':        {                    fputc (f,opf);                    fputc ('/',opf);                    fputc ('/',opf);                    status = CSTAT;        }        break;        case'*':    //       */     *  */        {                   int s = fgetc (ipf);                   switch (s)                   {                       case'/'://  */后还有语句                       {                              int n = fgetc (ipf);                              if (n!='\n'){                                  fputc ('\n',opf);                                  ungetc (n,ipf);                                  status = NULLSTAT;                              }                              else                              {                                  fputc (n,opf);                                  status = NULLSTAT;                              }                      }                           break;                       case EOF:                           status = EOFSTAT;                           break;                       default:                         fputc (f,opf);                         ungetc (s,ipf);                         status = CSTAT;                         break;                   }        }            break;        case EOF:        status = EOFSTAT;            break;        default:            fputc (f,opf);           break;    }}static void convert_work (FILE *ipf,FILE *opf){    while (status!=EOFSTAT)    {        switch (status)        {            case NULLSTAT://普通              do_null_stat (ipf,opf);              break;            case CPPSTAT://C++              do_cpp_stat (ipf,opf);              break;            case CSTAT://C              do_c_stat (ipf,opf);              break;            case EOFSTAT://EOF              break;            default:              break;        }    }}void convert_main (){    FILE *ipf = fopen(INPUT,"r");//以读方式打开    FILE *opf = fopen(OUTPUT,"w");//以写方式打开    convert_work (ipf,opf);    fclose (ipf);    fclose (opf);}

头文件 convert.h

#ifndef __CONVERT_H__#define __CONVERT_H__#define INPUT "input.c"#define OUTPUT "output.c"enum { EOFSTAT,NULLSTAT,CSTAT,CPPSTAT};void convert_main ();#endif

测试代码

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<Windows.h>#include"convert.h"int main (void){    convert_main ();    system ("pause");    return 0;}

在该项目的文件夹中创建一个 input文件,运行程序。文件列表中自动生成一个 output 文件。
该output文件就是 input 文件注释转换后的结果。

这里写图片描述
这里写图片描述

原创粉丝点击