注释转换(C --> C++)

标签: c语言 注释
173人阅读 评论(0) 收藏 举报
分类:

本文是将文件里面的C风格的注释,转换为CPP风格的注释。
C 的注释:/* XXX */
CPP 的注释://
转换时所有的情况如下图:

题目分析:
1、开始时,先将状态赋为空状态;
2、当遇到‘ /*’时进入C状态,将‘/*’ 改为‘//’;
再次遇到‘*/’时,C状态结束,如果后面是‘\n’,则原
样输出;
若不是,则需要加上‘\n’,再输出;
如果在‘/*’之后有多个‘*’则需要边读取边退回(ungetc)
3、当遇到‘//’时,不需要做任何处理,直接输出;
4、当遇到‘EOF’则结束。

测试代码如下图:

将左图的所有C语言注释转换为C++的注释;

下面是解决此问题的代码:

CommentConvert.h   //头文件
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__

#include<stdio.h>
#include <stdlib.h>

enum STATE
{
    END_STATE,
    NUL_STATE,
    C_STATE,
    CPP_STATE
};

void DoNulState(FILE*pfIn, FILE*pfOut, enum STATE* s);
void DoCState(FILE*pfIn, FILE*pfOut, enum STATE* s);
void DoCppState(FILE*pfIn, FILE*pfOut, enum STATE* s);

#endif //__COMMENT_CONVERT_H__
CommentConvert.c   //具体函数的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentConvert.h"

void DoNulState(FILE*pfIn, FILE*pfOut, enum STATE* s)
{
    int first = 0;
    first = fgetc(pfIn);
    switch(first)
    {
    case'/':
    {
               int second = fgetc(pfIn);
               switch (second)
               {
               case'/'://  '//'为C++状态,直接输出
               {

                          fputc(first, pfOut);
                          fputc(second, pfOut);
                          *s = CPP_STATE;
               }
                   break;
               case'*':
               {

                          fputc(first, pfOut);
                          fputc('/', pfOut);  //把'/*'转换为'//',C状态 需转换
                          *s = C_STATE; 
               }
                   break;
               default:
                   fputc(first, pfOut);
                   fputc(second, pfOut);
                   break;
               }
    }
        break;
    case EOF:
        fputc(first, pfOut);
        *s = END_STATE;
        break;
    default:
        fputc(first, pfOut);
        break;
    }
}
void DoCState(FILE*pfIn, FILE*pfOut, enum STATE* s)
{
    int first = 0;
    first = fgetc(pfIn);
    switch (first)
    {
    case'*':
    {
               int second = fgetc(pfIn);
               switch (second)
               {
               case'/':
               {
                          int third = fgetc(pfIn);
                          if (third == '\n')
                          {
                              fputc(third, pfOut);
                          }
                          else
                          {
                              fputc('\n', pfOut);//   遇到'*/'时 与前面的‘/*’作用注释其中的内容,
                              //fputc(third, pfOut); // 而如果'*/'后不是‘\n’则需要加上换行
                              ungetc(third, pfIn);
                          }
                          *s = NUL_STATE;
               }
                   break;
               case '*':
               {
                           //int third = getc(pfIn);
                           ungetc(second, pfOut);//ungetc: 把一个字符退回到输入流中
                                                 //防止多个'*'连用时'*/'中的*被提前读取
                           fputc(first, pfOut);  //fputc : 送一个字符到一个流中         
               }                                 
                   break;
               default:
                   fputc(first, pfOut);
                   fputc(second, pfOut);
                   break;
               }
    }
        break;
    case '/':
        //由于已经在C状态了,所以遇到‘/’时任然为正常代码
        *s = NUL_STATE;
        break;
    case '\n':
    {
                 fputc(first, pfOut);
                 fputc('/', pfOut);
                 fputc('/', pfOut);
    }
        break;
    case EOF:
        *s = END_STATE;
        break;
    default:
        fputc(first, pfOut);
        break;
    }
}
void DoCppState(FILE*pfIn, FILE*pfOut, enum STATE* s)
{
    int first = 0;
    first = fgetc(pfIn);
    switch (first)
    {
         case'\n':
         {
                     fputc(first, pfOut);
                     *s = NUL_STATE;
         }
             break;
         case EOF:
             *s = END_STATE;
             break;
         default:
             fputc(first, pfOut);
             break;
    }
}
test.c     //测试代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentConvert.h"

void test()
{
    FILE *pfIn = NULL;
    FILE *pfOut = NULL;
    enum STATE state;
    state = NUL_STATE;
    pfIn = fopen("input.txt", "r");
    if (pfIn == NULL)
    {
        perror("open file for read\n");
        exit(EXIT_FAILURE);
    }
    pfOut = fopen("output.txt", "w");
    if (pfOut == NULL)
    {
        perror("open file for write\n");
        fclose(pfIn);
        exit(EXIT_FAILURE);
    }
    while (state != END_STATE)
    {
        switch (state)
        {
        case NUL_STATE:
            DoNulState(pfIn, pfOut, &state);
            break;
        case C_STATE:
            DoCState(pfIn, pfOut, &state);
            break;
        case CPP_STATE:
            DoCppState(pfIn, pfOut, &state);
            break;
        default:
            break;
        }
    }
    fclose(pfIn);
    fclose(pfOut);
}
int main()
{
    test();
    getchar();
    return 0;
}
查看评论

用DELPHI为ASP开发文件上载组件

 用DELPHI为ASP开发文件上载组件 深圳王发军  返回 ASP(Active Server Page)是微软公司的产品,由于它编程很容易上手,能快速开发功能强大的动态网站,现在很多网站(特别是I...
  • ghj1976
  • ghj1976
  • 2001-04-17 16:06:00
  • 1770

注释转换 (将C注释转换为C++注释)

注释转换  注释转换 》  就是将代码中的注释转换为同一类的  , 比如是 C 语言 或者C++  C语言中  ,编译器默认的注释风格是    /*  .........*/    C++中 ...
  • WX_East
  • WX_East
  • 2016-08-11 10:41:38
  • 1336

注释转换<C注释-->C++注释>

# 本篇博客为简单的注释转换实现,功能为将简单的C注释段落转换为CPP注释 @ 注意: 代码中所用到的fopen,fwrite,fread等文件操作函数在通讯录文件流博客中做了介 绍:ht...
  • bitboss
  • bitboss
  • 2016-05-24 09:36:32
  • 1793

C语言注释与C++注释的相互转换

做此项目的经历主要的收获是熟悉了状态机这一方法的使用,还有就是对每实现一个功能就尽量封装一个函数这一概念把握的更为精到。状态机:关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的...
  • ljx_5489464
  • ljx_5489464
  • 2016-03-09 00:26:05
  • 944

c注释向c++注释的转换

在c语言中支持嵌套注释,而c++语言不支持 c注释风格:/*  */ c++注释风格:// 那么如何将c注释转换为c++注释呢? 大致有以下情况:        1.单行注释/* int ...
  • qq_38117478
  • qq_38117478
  • 2017-06-29 20:34:09
  • 111

C\C++注释风格转换(段注释转换为行注释)

1.问题分析             在C\C++中,代码的注释风格分为两种,第一种是段注释,这种注释风格是把注释内容放在“/*”和“*/”之间,注释内可以换行,还有一种风格是行注释,这种风格的注释是...
  • MBuger
  • MBuger
  • 2016-08-13 10:49:45
  • 1462

c语言小项目----注释转换

这篇博客,我将整理关于注释转换的知识,首先,得知道,注释转换包括,c语言注释转 换成c++注释,和c++注释转换成c语言注释。 c语言注释的风格:/*这是c语言注释*/ c++语言注释风格://这是c...
  • peiyao456
  • peiyao456
  • 2016-05-24 21:27:03
  • 1103

注释转换(C到C++的注释转换)

注释转换(C到C++的注释转换)
  • lu_1079776757
  • lu_1079776757
  • 2017-07-31 14:01:32
  • 138

C和CPP注释转换

注释转换是将如下几种情况的注释分别按情况转换为相应注释风格(将C注释转换为C++注释风格)首先我们需要两个文件来分别存储需要修改的源码和修改之后的代码,这里我将文件创建在当前目录之下注释转换的实现依据...
  • centor
  • centor
  • 2017-06-03 14:34:43
  • 642

经典注释转换项目!!经典注释转换项目!!

  • 2010年08月30日 13:27
  • 1.12MB
  • 下载
    个人资料
    等级:
    访问量: 2323
    积分: 308
    排名: 25万+
    文章分类