注释转换

我们在写程序时,为了增加程序的可读性,经常会写注释,帮助人们的理解,前面已经介绍过了,注释分为C语言风格注释和c++注释,c语言注释可以同时注释多行,但是不支持嵌套,c++风格注释一次可以注释一行,为了避免出错,人们通常选择c++注释;下面的程序就是将一个文件中的c风格注释全部改为c++风格注释。
分析:在编写这个程序时,我们需要考虑这样这几种情况:
1、当读一行代码,如果他的第一个字符不是‘/’,那么他一定不是被注释的内容;
2、当读入一行的第一个字符是‘/’时,那么就要考虑他是操作符(除),还是c风格注释的第一个字符,还是c++风格注释的第一个字符;
3、当已经判断好了它是c++风格注释,那么其后的内容原样输出就好;
4、如果已经有‘/’和‘’紧挨着出现,这个‘’就不输出,用‘/’代替其输出;
5、准备出注释,若在’/‘后面又出现一个’‘我们又需要判断这个’*‘到底是代码段中的内容,还是c注释的一部分。
所以就出现了这样几个状态:不是注释、准备注释、c++风格注释、c语言风格注释、准备出注释这五个过程;

下图就是分析的状态转换图:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef enum State
{
     BUSHI,//不是注释
     READY_GO,//准备注释
     C_COMMENT,//c语言注释
     CPP_COMMENT,//c++注释
     READY_OUT//准备出注释
}State;
int main()
{
     FILE* pIn = fopen("input.c", "r");
     assert(pIn != NULL);
     FILE* pOut = fopen("output.c", "w");
     assert( pOut != NULL);
     int ch = 0;
     int nextch = 0;
     State state = BUSHI;
     while (1)
     {
          ch = fgetc(pIn);
          if (ch == EOF)
              break;
          switch (state)
          {
          case BUSHI:
              if (ch == '/')
              {
                   fputc(ch, pOut);//输出/
                   state = READY_GO;//改状态
              }
              else//表示不是注释,可能是/除法
              {
                   fputc(ch, pOut);
                   state = BUSHI;//改状态
              }

              break;
          case READY_GO:
              if (ch == '/')//是c++注释
              {
                   fputc(ch, pOut);
                   state = CPP_COMMENT;//改状态
              }
              else if (ch == '*')//是C语言注释
              {
                   fputc('/', pOut);//将C语言注释改为c++注释
                   state = C_COMMENT;
              }
              else
              {
                   fputc(ch, pOut);
                   state = BUSHI;
              }
              break;
          case C_COMMENT:
              if (ch == '*')
              {
                   state = READY_OUT;//暂时留住*,先不输出
              }
              else
              {
                   fputc(ch, pOut);//将注释里面的内容输出
                   if (ch == '\n')
                   {
                        fputc('/', pOut);
                        fputc('/', pOut);
                   }
                   state = C_COMMENT;
              }
              break;
          case CPP_COMMENT:
              if (ch == '\n')//换行了,代表这一行的注释内容已经结束
              {
                   fputc(ch, pOut);
                   state = BUSHI;
              }
              else
              {
                   fputc(ch, pOut);//没有换行,就输出注释里面的内容
                   state = CPP_COMMENT;
              }
              break;
          case READY_OUT:
              if (ch== '*')
              {
                   fputc('*', pOut);//代表代码中的*,不是c风格注释里面的*
                   state = READY_OUT;
              }
              else if (ch == '/')
              {
                   nextch = fgetc(pIn);//表示在注释结束的这一行还有没有被注释的内容,需要给其换行,并且放在pOut中
                   if (nextch != "\n")
                   {
                        fputc("\n", pOut);
                   }
                   ungetc(nextch, pIn);
                   state = BUSHI;
              }
              else//输出注释中代码的内容
              {
                   //fputc('*', pOut);
                   fputc(ch, pOut);
                   state = C_COMMENT;
              }
              break;
          default:
              break;
          }
     }
     fclose(pOut);
     fclose(pIn);
     system("pause");
     return 0;
}

被改变的文件是:
改变后的文件变为:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值