《注释转换》
项目简介:将所有以C语言格式的注释转换成C++注释格式
开发环境:VS2013、 Windows
所用技术:文件指针、枚举、结构体指针
项目特点:
● C语言注释格式/**/转换为C++注释//
● 利用文件指针打开文件并读写文件,input、output导入导出文件
● 定义七个环境(一般情况、换行转换、多行注释、连续注释、匹配问题、连续的
**/、C++注释),利用枚举标志文件开始和结束
● 转换后不得改变原文件的含义并且编译链接无错误
● 所有的转换必须符合语法规则,注释转换支持注释嵌套
test.c
#include<stdio.h> #include"AnnotationConvert.h" int main() { ConvertState ret=AnnotationConvert("input.c", "output.c"); if (ret == FILE_ERROR) { printf("打开文件错误\n"); } else if (ret == SUCCESS) { printf("转换成功\n"); } else if (ret == NO_MATCH) { printf("不匹配\n"); } return 0; }
AnnotationConvert.h
#pragma once #include<assert.h> #include<errno.h> typedef enum ConvertState { SUCCESS, FILE_ERROR, NO_MATCH, }ConvertState; typedef enum State { C_BEING, C_END, }State; ConvertState Convert(FILE *fIn, FILE *fOut) { ConvertState ret= SUCCESS; char first, second; State tag = C_END; assert(fIn); assert(fOut); do{ first = fgetc(fIn); switch (first) { case'/': second = fgetc(fIn); if (second == '*') { //匹配问题 if (tag == C_END) { fputc('/', fOut); fputc('/', fOut); tag = C_BEING; } else { fputc('/', fOut); fputc('*', fOut); } } //C++ else if (second == '/') { char next; fputc('/', fOut); fputc('/', fOut); do { next = fgetc(fIn); fputc(next,fOut); if (next == EOF) return ret; } while (next != '\n'); } else { fputc(first, fOut); fputc(second, fOut); } break; case'\n'://多行注释 fputc('\n', fOut); if (tag == C_BEING) { fputc('/', fOut); fputc('/', fOut); } break; case'*': second = fgetc(fIn); if (second == '/') { //连续注释问题 char next = fgetc(fIn); if (next == '/') { fputc('\n', fOut); fseek(fIn,-1,SEEK_CUR); } //换行问题 else if (next != '\n'&&next != EOF) { fputc('\n',fOut); fputc(next,fOut); } else { fputc('\n', fOut); } tag = C_END; } //连续的*/问题 else if (second == '*') { fputc(first, fOut); fseek(fIn,-1,SEEK_CUR); } else { fputc(first, fOut); fputc(second, fOut); } break; default: if (first!=EOF) fputc(first, fOut); break; } } while (first != EOF); if (tag != C_END) { ret = NO_MATCH; } return ret; } ConvertState AnnotationConvert(const char* inputFile, const char* outputFile) { ConvertState ret; FILE *fIn, *fOut; fIn = fopen(inputFile,"r"); if (fIn == NULL) { printf("打开文件%s失败",inputFile); return FILE_ERROR; } fOut = fopen(outputFile,"w"); if (fOut == NULL) { fclose(fIn); printf("打开文件%s失败", outputFile); return FILE_ERROR; } ret=Convert(fIn,fOut); fclose(fIn); fclose(fOut); return ret; }
input.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=1; //int k=9; // int k = 9; //5.连续注释问题 // // //6.连续的**/问题 //* //7.C++注释问题 // /*xxxxxxxxx*/
output.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=1; int k=9; */int k = 9; //5.连续注释问题 /**//**/ //6.连续的**/问题 /***/ //7.C++注释问题 // /*xxxxxxxxx*/