首先歡迎閱讀本文,註釋轉換小項目涉及到c語言對文件的操作,另外這個小項目還應該對各種情況都考慮到。將c語言註釋轉換爲c++註釋
經過分析思考,我得到證據要的註釋轉換有以下幾類:我將之整理並放入一個文件裏,起名input.c
//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 f = 0; //5.連續註釋問題 /**//**/ //6.連續的**/問題 /***/ //7.C++註釋問題 // /*xxxxxxxxxxxxxxx*/
通過C語言代碼對其進行註釋轉換,並輸出到另一個文件裏,我起名爲output.c,
之所以起名後綴爲.c 是爲了打開方便,當然也可起名後綴爲.txt,.doc等等
程序代碼如下:
頭文件(函數定義):AnnotationConversion.h
#pragma once #include<stdlib.h> #include<stdio.h> #include<assert.h> #include<errno.h> typedef enum Srate { C_BEGIN, C_END, }Srate; void Convert(FILE *fIn, FILE *fOut); void AnnotationConversion(const char* inputFile, const char* outputFile);
實現文件(測試函數):
#include"AnnotationConversion.h" void Convert(FILE *fIn, FILE *fOut) //打開文件 { char first, second; Srate tag = C_END; assert(fIn); assert(fOut); do { first = fgetc(fIn); switch (first) { case '/': second = fgetc(fIn); if ('*' == second) { //3.匹配問題 if (tag == C_END) { fputc('/', fOut); fputc('/', fOut); tag = C_BEGIN; } else { fputc('/', fOut); fputc('*', fOut); } } else if ('/' == second) //C++註釋問題 { char next; fputc('/', fOut); fputc('/', fOut); do { next = fgetc(fIn); if (EOF == next) { break; } else fputc(next, fOut); } while (('\n' != next) && (EOF != next)); } else { fputc(first, fOut); fputc(second, fOut); } break; case'\n': fputc('\n', fOut); if (tag == C_BEGIN) //4.多行註釋問題 { fputc('/', fOut); fputc('/', fOut); } break; case '*': second = fgetc(fIn); if (second == '/') { // 2.換行問題 char next = fgetc(fIn); if (EOF == next) { fseek(fIn, -1, SEEK_CUR); } //5.連續註釋問題 else if ('/' == next) { fputc('\n', fOut); fseek(fIn, -1, SEEK_CUR); } else if (('\n' != next) && (EOF != next)) { fputc('\n', fOut); fputc(next, fOut); } else fputc('\n', fOut); tag = C_END; } else if ('*' == second) //6.連續的**/問題 { fputc(first, fOut); fseek(fIn, -1, SEEK_CUR); } else { fputc(first, fOut); fputc(second, fOut); } break; default: if (EOF == first) break; fputc(first, fOut); break; } } while (first != EOF); } void AnnotationConversion(const char* inputFile, const char* outputFile) { FILE * fOut, *fIn; fIn = fopen(inputFile, "r"); if (fIn == NULL) { printf("打開文件%s失敗!errno:%d\n", inputFile, errno); return; } fOut = fopen(outputFile, "w"); if (fOut == NULL) { fclose(fIn); printf("打開文件%s失敗!errno:%d\n", inputFile, errno); return; } Convert(fIn, fOut); fclose(fIn); fclose(fOut); } int main() { AnnotationConversion("input.c","output.c"); system("pause"); return 0; }
結果如下:原本output.c文件裏啥也沒有,運行程序之後結果如下:
//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 f = 0; //5.連續註釋問題 // // //6.連續的**/問題 //* //7.C++註釋問題 // /*xxxxxxxxxxxxxxx*/
測試結果無誤,限於本人目前水平,只能寫出如上代碼,帶有進步之時,定會再做修改,如果那位發現了問題,懇請對我提出批評指正,謝謝