C注释风格转化为C++风格注释

C转C++可能遇到的问题:

//1.一般情况

/* int i = 0; */

// 2.换行问题

/* int i = 0; */ int j = 0;

/* int i = 0; */

int j = 0;

// 3.匹配问题

/*int i = 0;/*xxxxx*/

// 4.多行注释问题

/*

int i=0;

int j = 0;

int k = 0;

*/int k = 0;

// 5.连续注释问题

/**//**/

// 6.连续的**/问题

/***/

// 7.C++注释问题

// /*xxxxxxxxxxxx*/

我们可以发现注释转换需要考虑的情况是非常多的,这对于我们写程序是非常不利的,为解决这类问题,我们引入有限状态机的概念。

有限状态机简称状态机,是表示有限个状态以及在这些状态之间转移的行为的 模型。有限状态机是闭环系统,可以用有限的状态处理无穷的状态。

通常我们使用switch case语句来处理有限状态机,

switch (state )

{

case 1:

// ...

break ;

case 2:

// ...

break ;

case 3:

// ...

break ;

.

.

case n :

break ;

default :

}

主要代码设计:

1,我们要声明一个枚举(enum)类型来存放四种状态

typedef   enum CONVERT_STATE

{

NULL_STATE,

C_STATE,

CPP_STATE,

END_STATE,

}StateType;

定义全局变量state,初始状态为NULL_STATE.

2,声明一个打开input.c和output.c的函数

void CommentConvert()

{

FILE *pWrite=NULL ;

FILE *pRead = fopen("input.c" , "r");

if (pRead == NULL )

{

perror( "open file for read");

exit( EXIT_FAILURE);

}

pWrite = fopen( "output.c", "w" );

if (pWrite == NULL )

{

fclose(pRead);

perror( "open file for write");

exit( EXIT_FAILURE);

}

ConvertWork(pRead, pWrite);

fclose(pRead);

fclose(pWrite);

}

3,声明一个切换状态的函数

void ConvertWork(FILE *pRead, FILE *pWrite )

{

state = NULL_STATE;

while (state != END_STATE)

{

switch (state)

{

case NULL_STATE:

DoNullState( pRead, pWrite );

break;

case C_STATE:

DoCState( pRead, pWrite );

break;

case CPP_STATE:

DoCppState( pRead, pWrite );

break;

}

}

}

4,我们还要声明处理不同状态的函数

处理NULL_STATE的函数:

void DoNullState(FILE *read, FILE *write)

{

int first = fgetc(read );

int second = 0;

switch (first)

{

case ‘/‘ :

second = fgetc(read);

if (second == ‘*‘ )

{

fputc(first, write);

fputc( ‘/‘, write );

state = C_STATE;

}

else if (second == ‘/‘)

{

fputc(first, write);

fputc( ‘/‘, write );

state = CPP_STATE;

}

else

{

fputc(first, write);

fputc(second, write);

}

break;

case EOF :

fputc(first, write);

state = END_STATE;

break;

default:

fputc(first, write);

break;

}

}

处理C_STATE的的函数:

void DoCState(FILE *read, FILE *write)

{

int first = fgetc(read );

int second = 0;

switch (first)

{

case ‘/‘ :

second = fgetc( read);

if (second == ‘*‘ )

{

}

else if (second == ‘/‘)

{

}

else

{

fputc(first, write);

fputc(second, write);

}

break;

case ‘\n‘ :

fputc( ‘\n‘, write );

fputc( ‘/‘,write );

fputc( ‘/‘, write );

break;

case ‘*‘ :

second = fgetc( read);

if (second == ‘*‘ )

{

fputc(first, write);

first=fgetc( read);

if (first == ‘/‘ )

{

fputc( ‘\n‘, write );

state = NULL_STATE;

}

}

else if (second == ‘/‘)

{

fputc( ‘\n‘, write );

state = NULL_STATE;

}

else

{

fputc(first, write);

fputc(second, write);

}

break;

case EOF :

fputc(first, write);

state = END_STATE;

break;

default:

fputc(first, write);

break;

}

}

处理CPP_STATE的函数:

void DoCppState(FILE *read, FILE *write)

{

int first = fgetc(read );

int second = 0;

switch (first)

{

case ‘/‘ :

second = fgetc(read);

if (second == ‘*‘ )

{

}

else if (second == ‘/‘)

{

}

else

{

fputc(first, write);

fputc(second, write);

}

break;

case ‘\n‘ :

fputc(first, write);

state = NULL_STATE;

break;

case ‘*‘ :

second = fgetc(read);

if (second == ‘/‘ )

{

}

else

if (second == ‘*‘ )

{

fputc(first, write);

}

break;

case EOF :

fputc(first, write);

state = END_STATE;

break;

default:

fputc(first, write);

break;

}

}

如图:input.c

运行程序后打开output.c:

时间: 2024-10-10 19:25:04

C注释风格转化为C++风格注释的相关文章

[数据结构]c++注释转化为c语言注释

每个程序员的代码注释风格不同,为统一代码注释风格,有时需要将c++注释转化为c语言注释或者反之,人工修改速度太慢,且容易出错,要是有一个专门负责注释代码转化的程序,必定事半功倍!! 题目要求: 注释转化要求如下: 注释的嵌套情形很多,这里只是举例,你需要遵照C/C++语言的注释规则来编写代码,我不会仅测试这里的例子. 1.单行注释或没有嵌套,注释行直接转换,如: ①//123                             /* 123 */ ②/* 123 */            

将markdown格式转化为bootstrap风格html

前言:这些年markdown格式的文件很流行,像github里project说明文档都是用markdown格式编写. 一方面,我们能够通过pandoc将markdown文件转换为html,这样将html文件放到自己的server上就能够解释了.安装pandoc见我的GitHub链接. 还有一方面,bootstrap是近年来一个比較好的web前端框架,那么我们希望将markdown文件转换为bootstrap风格的html文件.已经有人做过这个模块markdown2bootstrap. 1. 安装

camel-name-utils 在驼峰风格跟下划线风格之间切换

用处 用来将字符串在驼峰风格跟下划线风格之间切换.对于一般人可能没用,对于写orm框架的人有点作用. 例子: company_name -> companyName 安装方式 添加以下依赖到pom.xml <dependency> <groupId>org.crazycake</groupId> <artifactId>camel-name-utils</artifactId> <version>1.0.0-RELEASE<

C风格字符串与C++风格字符串

C风格字符串与C++风格字符串 C风格字符串:对字符串进行操作的 C 函数定义在头文件<cstring>中: 1. 字符串定义:char* result: 2. 字符串的最后一个字符是null字符('\0'),可以通过这个字符确定字符串的结尾. 3. strlen()返回的是字符串的大小:因此,分配空间的时候,需要比字符串的实际空间大1. e.g. char* copyString(const char* inString) { char *result = new char[strlen(i

oracle查看该用户的所有表名字、表注释、字段名、字段注释、是否为空、字段类型

--oracle查看该用户的所有表名字.表注释.字段名.字段注释.是否为空.字段类型 select distinct TABLE_COLUMN.*, TABLE_NALLABLE.DATA_TYPE, TABLE_NALLABLE.NULLABLE from (select distinct utc.table_name table_name, utc.comments table_comments, ucc.column_name column_name, ucc.comments colum

C++注释转化为C语言注释

利用有限状态机实现输入文件中代码不同状态的转换,将结果显示在输出文件中 #include<iostream> using namespace std; extern "C" int ConvertComment(FILE *inputfile, FILE *outputfile); int main() {   /*定义输入和输出文件*/ <span style="white-space:pre"> </span>FILE *fp

请对 POSIX 风格和兼容 Perl 风格两种正则表达式的主要函数进行类比说明

POSIXF风格的正则表达式主要函数有ereg 函数:(正则表达式匹配).ereg_replace 函数:(正则表达式替换) Perl风格的正则表达式主要函数有preg_match 函数:(进行正则表达式匹配).preg_replace  函数:(执行正则表达式的搜索和替换)   1.匹配正则表达式对比 int ereg ( string $pattern , string $string [, array &$regs ] ) int preg_match ( string $pattern

jeecg 3.5.2 新版本4种首页风格 【经典风格,shortcut风格,ACE bootstrap风格,云桌面风格】

[1]经典风格: [2]Shortcut风格: [3]ACE bootsrap风格: [4]云桌面风格: [5]自定义图表 [6].系统监控

【转】mfc win7获得管理员权限 使用WIN7风格 使用当前系统风格

原帖:http://blog.csdn.net/zengweicdut/article/details/8837688 在win7下,操作系统文件夹下的东西,需要程序拥有管理员权限才可以,程序拥有管理员权限的方法为: 一.添加管理员权限 1.在Resource View中添加一个文件夹,名称为24,将文件夹下的资源名称改为1.操作如图: (1) (2) (3) 2.在资源1中添加下面的值,将下面的文字复制,粘贴进去就可以: <?xml version="1.0" encoding