注释转换
来源:互联网 发布:和田玉 知乎 编辑:程序博客网 时间:2024/06/11 14:43
注释转换的功能:
可将注释方式总结为7中:
//1.一般情况
/* int i = 0; */
//2.换行问题
/* int i = 0; */ int j = 0;
/* int i = 0; */
int j = 0;
//3.匹配问题
/* int i = 0; /*xxxxxxx*/
//4.多行注释问题
/*
int i = 0;
int j = 0;
int k = 0;
*/int k = 0;
//5.连续注释问题
/**/ /**/
//6.连续**/问题
/***/
//7.c++注释问题
// /*xxxxxxxx*/
解题思路:把问题用有限状态机解决
代码如下:
//CommentConvert.h#ifndef __COMMENTCOVERT_H__#define __COMMENTCOVERT_H__#include<stdio.h>#include<stdlib.h>#include<windows.h>#define INPUT_FILE "input.c"#define OUTPUT_FILE "output.c"enum STATE{NUL_STATE,C_STATE,CPP_STATE,STR_STATE,END_STATE};void commentconvert(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);void DO_STR_STATE(FILE *pfRead, FILE *pfWrite);#endif //__COMMENTCOVERT_H__
//CommentConvert.c#include "CommentConvert.h"enum STATE state = NUL_STATE;void commentconvert(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 STR_STATE:DO_STR_STATE(pfRead, pfWrite);break;case END_STATE:break;}}}void DO_NUL_STATE(FILE *pfRead, FILE *pfWrite){int first = 0;int second = 0;first = fgetc(pfRead);switch (first){case '/':second = fgetc(pfRead);if (second == '/'){fputc('/', pfWrite);fputc('/', pfWrite);state = CPP_STATE;//无状态下遇到 //, 直接将 // 写入,并进入CPP状态}else if (second == '*'){fputc(first,pfWrite);fputc('/', pfWrite);state = C_STATE;//无状态下遇到 /* ,将 /* 变成 // 写入,并进入C状态}else{fputc(first, pfWrite);fputc(second, pfWrite);//遇到其他的字符,直接写入,不改变状态}break;case EOF:state = END_STATE;//遇到 EOF ,进入结束状态break;case '"':fputc(first, pfWrite);state = STR_STATE;//如果遇到 ”,进入字符串状态break;default:fputc(first, pfWrite);break;}}void DO_C_STATE(FILE *pfRead, FILE *pfWrite){int first = 0;int second = 0;int third = 0;first = fgetc(pfRead);switch (first){case '*':second = fgetc(pfRead);if (second == '/')//遇到 */ ,表示c的注释结束,进入无状态{state = NUL_STATE;third = fgetc(pfRead);if (third != '\n'){fputc('\n', pfWrite);//如果 */ 后面不是回车,则写入回车,然后把读到的字符放回ungetc(third, pfRead);}else{ungetc(third, pfRead);//如果 */ 后面是回车,把回车放回}}else //.......{fputc(first, pfWrite);ungetc(second, pfRead);}break;case '\n':fputc(first, pfWrite);fputc('/', pfWrite);fputc('/', pfWrite);break;default:fputc(first, pfWrite);break;}}void DO_CPP_STATE(FILE *pfRead, FILE *pfWrite){int first = 0;int second = 0;first = fgetc(pfRead);switch (first){case '\n':fputc(first, pfWrite);//CPP状态,遇到回车,则进入无状态state = NUL_STATE;break;default:if (first == EOF){state = END_STATE;}else{fputc(first, pfWrite);}break;}}void DO_STR_STATE(FILE *pfRead, FILE *pfWrite){int first = 0;first = fgetc(pfRead);switch (first){case '"':fputc(first, pfWrite);state = NUL_STATE;break;default:fputc(first, pfWrite);break;}}
//test.c#define _CRT_SECURE_NO_WARNINGS 1#include"CommentConvert.h"int main(){FILE *pfRead = NULL;FILE *pfWrite = NULL;pfRead = fopen(INPUT_FILE, "r");if (pfRead == NULL){perror("open file for read");exit(EXIT_FAILURE);}pfWrite = fopen(OUTPUT_FILE, "w");if (pfWrite == NULL){perror("open file for write");fclose(pfRead);exit(EXIT_FAILURE);}commentconvert(pfRead, pfWrite);fclose(pfRead);fclose(pfWrite);system("pause");return 0;}
0 0
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 注释转换
- 仪表盘
- 手游斗地主打牌界面的UI实现
- Caffe学习笔记4图像特征进行可视化
- 子线程更新UI的方法
- UILable文字竖排的方法汇总
- 注释转换
- VPN协议PPTP/L2TP/OpenVPN及SSH的区别与详解
- es6 javascript的class类中的 get和set
- timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' 报错 invalid default value
- mysql 多行数据转换xml
- Android屏幕适配全攻略(最权威的官方适配指导)
- hdu1198(DFS/并查集)
- 高焕堂视频学习笔记:认识进程和IPC架构
- 闭包