关闭

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

标签: c语言注释
157人阅读 评论(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;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

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

做此项目的经历主要的收获是熟悉了状态机这一方法的使用,还有就是对每实现一个功能就尽量封装一个函数这一概念把握的更为精到。状态机:关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围...
  • ljx_5489464
  • ljx_5489464
  • 2016-03-09 00:26
  • 834

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

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

C和CPP注释转换

注释转换是将如下几种情况的注释分别按情况转换为相应注释风格(将C注释转换为C++注释风格)首先我们需要两个文件来分别存储需要修改的源码和修改之后的代码,这里我将文件创建在当前目录之下注释转换的实现依据有限状态机编程思想,状态转换如下图所示:下面是input.c文件内修改的源码的注释及需要转换的情况的...
  • centor
  • centor
  • 2017-06-03 14:34
  • 516

C/C++ 代码规范: 命名规则、注释、格式

摘抄精简Google 开源项目风格指南: http://zh-google-styleguide.readthedocs.org/en/latest/contents/ 一. 命名规则 永远不要使用单词缩写(如count写成cnt) C/C++ 代码规范: 命名规则、注释、格式 变量名: ...
  • quzhongxin
  • quzhongxin
  • 2015-05-15 10:08
  • 3005

C/C++的注释转换

C/C++的注释风格有两种,一种是“/*xxxxxxx*/ ”,这种注释可以注释行也可注释段    第二种是“//”,这种注释只能注释行 目标要实现将所有/* xx*/注释风格变成//注释风格 思路:使用有限状态机编程 可能会出现的情况 // 1.一般情况 int nu...
  • NICOC_
  • NICOC_
  • 2017-05-28 10:50
  • 383

C与C++注释转换

CommentConvert.h内容 #ifndef __COMMENT_CONVERT_H__   #define __COMMENT_CONVERT_H__    #include   #include    enum STATE//枚...
  • qq_35420908
  • qq_35420908
  • 2016-08-12 20:26
  • 303

C/C++注释转换

将 / * … * / 注释转换为 / / 注释。transform.h#ifndef __transform_h__ #define __transform_h__#define MY_INPUT "input.c" #define MY_OUTPUT "out...
  • qq_36391130
  • qq_36391130
  • 2017-12-03 02:32
  • 23

注释转换(C++到C)

在注释转换的学习中,仍有很多不足,希望大家可以批评改正,谢谢~ 满足条件: 1.C++风格的注释//注释转换为标准C分风格/* */注释 2./*  */风格的注释保持原样 3.所有的转换需要符合语法规则 4.注释转换需要支持注释嵌套 注释转换要求: 注释的嵌...
  • qaz3171210
  • qaz3171210
  • 2015-06-16 11:12
  • 517

C到C++注释的转换

利用状态机的思想来解决C注释到C++注释的转换。(不允许注释嵌套) 在状态内处理,状态间跳转,根据不同的的事情发生相应的动作,并进行相应的状态转换。
  • love18792838953
  • love18792838953
  • 2017-07-30 10:59
  • 224

C向C++的注释的转换

若想完成C注释向C++注释的转换:首先要识别注释语言的种类,例如://hello 是C++的注释标准,/*hello*/是C的注释标准,转换的过程就是指针指向的如果是相邻的// 则·照常输入·,如果·遇见换行,则进入普通状态,重新对下一个字符进行判断。 如果遇见相邻的/...
  • mt_09
  • mt_09
  • 2017-12-07 17:40
  • 15
    个人资料
    • 访问:1682次
    • 积分:221
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类