C语言注释转化为C++注释(C语言实现)

来源:互联网 发布:小幸软件工作室 编辑:程序博客网 时间:2024/05/29 07:41

/* int a=0;*/是C语言注释风格,而我们都知道C语言这样的注释是有缺陷的(不能嵌套注释),为了弥补这一缺陷,可将C语言注释风格改为C++注释风格(//int a=0;).本文就来讲一下怎么运用C语言实现C注释转化为C++注释。

在一段代码中,往往会出现很多种情况,先来讨论一下可能存在的情况。

看图:(NUL代表正常情况,END代表结束


请看具体代码:

头文件及函数声明(ComentConvert.h)部分

#define _CRT_SECURE_NO_WARNINGS#ifndef __COMMENT_CONVER_H__#define __COMMENT_CONVER_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);//处理C语言注释部分void DoCPPState(FILE* pfIn, FILE* pfOut, enum STATE *s);//处理C++注释部分#endif//__COMMENT_CONVER_H__

具体函数实现ConmentConvert.c部分

#define _CRT_SECURE_NO_WARNINGS#include "ComentConvert.h"void DoNulState(FILE* pfIn, FILE* pfOut, enum STATE *s){int first = 0;first = fgetc(pfIn);switch (first){case '/':{int second = 0;second = fgetc(pfIn);switch (second){case '/':fputc(first, pfOut);fputc(second, pfOut);*s = CPP_STATE;break;case '*':fputc(first, pfOut);fputc(first, pfOut);*s = C_STATE;break;default:fputc(first, pfOut);fputc(second, pfOut);break;}}break;case EOF:*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 = 0;second = fgetc(pfIn);switch (second){case '*':ungetc(second, pfIn);fputc(second, pfOut);break;case '/':fputc('\n', pfOut);*s = NUL_STATE;break;default:fputc(first, pfOut);fputc(second, pfOut);break;}}break;case '\n':fputc(first, pfOut);fputc('/', pfOut);fputc('/', pfOut);break;default:fputc(first, pfOut);break;}}void DoCPPState(FILE* pfIn, FILE* pfOut, enum STATE *s){int first = 0;first = fgetc(pfIn);switch (first){case EOF:*s = END_STATE;break;default:fputc(first, pfOut);*s = NUL_STATE;break;}}

 #include "ComentConvert.h"void test(){FILE* pfIn = NULL;FILE* pfOut = NULL;pfIn = fopen("input.c", "r");if (pfIn == NULL){perror("open a file for read");exit(EXIT_FAILURE);}pfOut = fopen("output.c", "w");if (pfOut == NULL){perror("open a file for write");fclose("input.c");exit(EXIT_FAILURE);}enum STATE state=NUL_STATE;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;}}}int main(){test();return 0;}

注释转换前后的对比:


PS:欢迎大家提出宝贵意见