注释转换
来源:互联网 发布:java 对比相似度 编辑:程序博客网 时间:2024/05/30 04:11
注释转换:
题目描述:
给定一段代码,其中有c语言的注释风格,也有c++的注释风格,要求将c语言的注释风格转换为c++的注释风格,属于c++注释风格的不转换,剩余其他原样输出。
题目分析如下图:
需要的函数:首先我们需要3种状态和一个切换状态的函数,
1.空状态void Do_NUL_State(),即既不属于c状态也不属于c++状态;
2.c状态void Do_C_State(),需要将/*x*/,转换为//x;;
3.c++状态,即属于c++注释风格的不变
void Do_CPP_State();
4;切换函数void ConmentConvert(),用于切换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;
// 5.连续注释问题
/**//**/
// 6.连续的**/问题
/***/
// 7.C++注释问题
// /*xxxxxxxxxxxx*/
头文件部分:
#define _CRT_SECURE_NO_WARNINGS 1#ifndef __CONMENTCONVERT_H#define __CONMENTCONVERT_H#include<stdio.h>#include<stdlib.h>#include<string.h> #define INPUTFILENAME "input.c"#define OUTPUTFILENAME "output.c"enum STATE{NUL_STATE,C_STATE,CPP_STATE,END_STATE};void ConmentConvert(FILE *pfRead,FILE *pfWrite);void Do_NUL_State(FILE *pfRead,FILE *pfWrite);void Do_C_State(FILE *pfRead,FILE *pfWrite);void Do_CPP_State(FILE *pfRead,FILE *pfWrite);#endif主函数部分:
<span style="color:#6600cc;">#include"ConmentConvert.h" int main() { FILE *pfread=NULL; FILE *pfwrite=NULL; printf("转化开始\n"); pfread=fopen(INPUTFILENAME,"r"); if(NULL == pfread) { perror("open file for read\n"); exit(EXIT_FAILURE); } pfwrite=fopen(OUTPUTFILENAME,"w"); if(NULL == pfwrite) { fclose(pfread); perror("open file for write\n"); exit(EXIT_FAILURE); } ConmentConvert(pfread,pfwrite); printf("转化结束\n"); system("pause");return 0;} </span>函数实现部分:
<pre name="code" class="cpp"><span style="font-size:18px;color:#ff0000;"><strong>#define _CRT_SECURE_NO_WARNINGS 1#include"conmentconvert.h"enum STATE state=NUL_STATE;int frist=0;int second=0;int third=0;void Do_NUL_State(FILE *pfRead,FILE *pfWrite){frist=fgetc(pfRead);switch(frist){case '/':second=fgetc(pfRead);if(second=='*'){fputc('/',pfWrite);fputc('/',pfWrite);state=C_STATE;}else if(second=='/'){fputc(frist,pfWrite);fputc(second,pfWrite);state=CPP_STATE;}else//其他字符直接输出{fputc(frist,pfWrite);fputc(second,pfWrite);}break;case EOF://文件结束标志 state=END_STATE; break;default:fputc(frist,pfWrite);//处理不是注释的字符break;}}void Do_C_State(FILE *pfRead,FILE *pfWrite){frist=fgetc(pfRead);switch(frist){case '*':second=fgetc(pfRead); switch(second) { case '*': // 6.连续的/***/问题 third=fgetc(pfRead); fputc(frist,pfWrite); if(third == '/') { state=NUL_STATE; } break; case '/': third=fgetc(pfRead); if(third == '/') //5.连续的注释问题/**//**/ { ungetc('/',pfRead); state=NUL_STATE; break; } else { fputc(third,pfWrite); // /* int i = 0; */ \n int j = 0; state=NUL_STATE; break; } default: //不是注释的字符 fputc(frist,pfWrite); fputc(second,pfWrite); break; } break; case '\n': fputc('\n',pfWrite); //4.C注释中的多行注释 fputc('/',pfWrite); fputc('/',pfWrite); break; case EOF:state=END_STATE;break;default:fputc(frist,pfWrite);break;}}void Do_CPP_State(FILE *pfRead,FILE *pfWrite){frist=fgetc(pfRead);switch(frist){case '\n':fputc(frist,pfWrite);state=NUL_STATE;break;case EOF:state=END_STATE; break; default:fputc(frist,pfWrite); break;}}void ConmentConvert(FILE *pfRead,FILE *pfWrite){while(state != END_STATE){switch(state){case NUL_STATE:Do_NUL_State(pfRead,pfWrite);break;case C_STATE:Do_C_State(pfRead,pfWrite);break;case CPP_STATE:Do_CPP_State(pfRead,pfWrite);break;case END_STATE:break;default:break;}}}</strong></span>
1 0
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- android手机通讯录数据库重要表介绍
- MySQL各种存储引擎的对比
- 学习感悟:态度决定一切
- 经纪人(图论,fyold算法)
- HTML事件默认行为与事件传播
- 注释转换
- Java基础回顾 : 线程的实现方式
- Win10系统总是提示"在商店中查找应用"的关闭方法
- Canvas类简介
- hdu 1269 迷宫城堡(tarjan 算法)
- 关于java中一些代码的理解
- Java入门篇
- PAT乙级—1044. 火星数字(20)-native
- 单链表反转