C中注释转化为C++中注释类型

来源:互联网 发布:微信公众号seo 编辑:程序博客网 时间:2024/06/06 00:43


实现注释行的转化

//convert.h 头文件#ifndef __CONVERT_H__#define __CONVERT_H__#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#define INPUT "input.c"//定义宏代替访问的文件#define OUTPUT "output.c"//声明一个枚举类型,标识文档状态enum STA{NULLSTAT,CSTAT,CPPSTAT,EOFSTAT};void Convert_main(FILE * input, FILE * output);#endif
//convert.c 实现转化文件#define _CRT_SECURE_NO_WARNINGS 1#include"convert.h"enum STA status = NULLSTAT;void Do_nullstata(FILE * input, FILE * output)//普通情况处理{int f = fgetc(input);switch (f){case '/':{int s = fgetc(input);switch (s){case '/':fputc('/', output);fputc('/', output);status = CPPSTAT;//若遇到//,转为C++状态注释处理break;case '*':fputc('/', output);fputc('/', output);status = CSTAT;//若遇到/*,转为C状态注释处理break;default:fputc(f, output);//其它情况的话,输出这个字符ungetc(s, input);//注意:此处的第二个字符应该退回,//因为不确定它与下一个字符结合会是什么情况}}break;case EOF:status = EOFSTAT;//若遇得到文件结尾,转为文件结束状态处理break;default://若是正常字符,输出即可fputc(f, output);status = NULLSTAT;//保留现在的状态break;}}void Do_cstata(FILE * input, FILE * output)//C注释状态处理{int f = fgetc(input);switch (f){case '\n':fputc(f, output);//遇到换行符则换行,并在下一行注释前面加//fputc('/', output);fputc('/', output);status = CSTAT;break;case '*':{int s = fgetc(input);switch (s){case '/':{int t = fgetc(input);if (t != '\n'){fputc('\n', output);ungetc(t, input);//若是遇到*/则注释结束,若注释后面有内容,则退回读取,设为普通状态//例如   *//int q = 9527;}status = NULLSTAT;break;}default:fputc(f, output);ungetc(s, input);//若只是一个*号,后面不是/,则输出*,第二个字符退回读取,状态不变//例如  /* int j = 10,2*3=6; */break;}}break;case EOF:status = EOFSTAT;break;default:fputc(f, output);status = CSTAT;break;}}void Do_cppstata(FILE * input, FILE * output)//C++注释状态处理{int f = fgetc(input);switch (f){case '\n':fputc(f, output);//遇到换行符,则输出,并将其转换为普通状态status = NULLSTAT;break;case EOF:status = EOFSTAT;break;default :fputc(f, output);//若是普通字符则输出,继续保留C++注释状态status = CPPSTAT;break;}}void Do_eofstata(FILE * input, FILE * output)//文件结束处理{int f = fgetc(input);fputc(f, output);}void Convert_main(FILE * input, FILE * output){while (status != EOFSTAT)//循环访问,若每次没有遇到EOF,则继续访问{switch (status){case NULLSTAT:Do_nullstata(input, output);break;case CSTAT:Do_cstata(input, output);break;case CPPSTAT:Do_cppstata(input, output);break;case EOFSTAT:Do_eofstata(input, output);break;default:break;}}}
//main.c 主函数文件#define _CRT_SECURE_NO_WARNINGS 1#include "convert.h"int main(){FILE * finp=fopen(INPUT, "r");FILE * foutp = fopen(OUTPUT, "w");if (finp == NULL || foutp == NULL){sprintf(stderr, "open file");exit(1);}else{Convert_main(finp, foutp);}fclose(finp);fclose(foutp);fflush(stdin);getchar();return 0;}
//input.c 测试用例文件//我是测试用例// this is cpp \ncomment/* int i = 0; *//* int j = 10,2*3=6; */int k = 3;/*555*/int n = 20;n / 2 = 10;/*int i = 0;int j = 20;int k = 250;*//int q = 9527;/***//* int z = 7748258; *//*int b=94250;*/// /*dsklfjdasl;fdsf;ldsfds*/
//output.c 转化输出文件//我是测试用例// this is cpp \ncomment// int i = 0; // int j = 10,2*3=6; int k = 3;//555int n = 20;n / 2 = 10;////int i = 0;//int j = 20;//int k = 250;///int q = 9527;//*// int z = 7748258; //int b=94250;// /*dsklfjdasl;fdsf;ldsfds*/





原创粉丝点击