您好,登錄后才能下訂單哦!
最近剛開始學習c++,接觸了一個小項目,寫一個程序將C語言的注釋轉化為c++的注釋,這個里面也要分很多種情況,下面我就把我做的小程序分享出來,
在把C語言注釋轉化為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 = 0; int k = 0; */int k = 0;
5.連續注釋
/**//**/
6.連續的**/問題
/***/
7.c++注釋問題
// /*xxxxxxxxxxx*/
下面就分情況處理一下這幾種情況 首先,你要成功創建一個文件并能夠把C語言的注釋寫進去
void AnnotationConvert(const char* inputFile, const char* outputFile) { FILE* fIn = fopen(inputFile, "r");//用只讀的方式打開一個文件 //檢測文件是否打開成功,并輸出錯誤碼 //只讀方式打開文件失敗,有可能是文件不存在或路徑錯誤等問題 if (fIn == NULL) { printf("打開文件%s失敗,errno:%d", inputFile,errno); return; } //寫方式打開文件失敗,這是要注意關閉已打開的fIn,否則可能導致內存泄漏等問題 FILE* fOut = fopen(outputFile, "w"); if (fOut == NULL) { fclose(fIn);//關閉文件流 printf("打開文件%s失敗,errno:%d", outputFile,errno); return; } Convert(fIn, fOut); //打開文件成功,要注意關閉文件流 fclose(fIn); fclose(fOut); } 在這里,可以定義兩個枚舉常量用來判斷是c語言注釋的開始還是結束 typedef enum State { C_BEGIN, C_END, }State; void Convert(FILE* fIn, FILE*fOut) { //斷言文件流 assert(fIn); assert(fOut); char first, second;//讀取兩個字符 State tag = C_END; do { first = fgetc(fIn); switch (first) { //1.普通情況 /*int i = 0;*/ case'/': second = fgetc(fIn); if (second == '*')//當讀取的第一個字符為/第二個字符為*時 { //3.匹配問題/*int i = 0;/*xxxxx*/ if (tag == C_END)//判斷是否上一個C語言注釋已結束,即一個C語言注釋的開始, //若是,轉化為c++注釋的開始 { fputc('/', fOut); fputc('/', fOut); tag = C_BEGIN; } else //若不是,按原樣輸出 { fputc('/', fOut); fputc('*', fOut); } } //7.c++注釋問題 // /*xxxxxxxxxxx*/ else if (second == '/') //當讀取的第一個字符為/且第二個字符也為/ { fputc('/', fOut); //按原樣輸出 fputc('/', fOut); char next; do { next = fgetc(fIn); //讀取第三個字符并輸出它 fputc(next, fOut); } while (next != '\n' && next != EOF); } else { fputc(first, fOut); fputc(second, fOut); } break; case'*': second = fgetc(fIn); if (second == '/') //當第一個字符為*第二個字符為/時輸出一個換行 { char next = fgetc(fIn); //5.多行注釋 /**//**/ fputc('\n', fOut); if (next == '/') //當讀取的第三個字符也為/時,倒退讀取一個字符判斷是否為多行注釋的問題 { fseek(fIn, -1, SEEK_CUR);//倒退讀取 } //2.換行問題/*int i = 0;*/intj = 0; else if (next != '\n'&& next != EOF) //當讀取的第三個字符不為換行不是/且不是文件結束的標志時,輸出第三個字符 { fputc(next, fOut); } else { fputc('\n', fOut); } tag = C_END; //C語言注釋的結尾,將用作標志的枚舉常量置為end } //6.連續的**/問題 /***/ else if (second == '*') //當讀取的第二個字符為*時,輸出第一個字符且倒退讀取一個字符 { fputc(first, fOut); fseek(fIn, -1, SEEK_CUR); } else { fputc(first, fOut); fputc(second, fOut); } break; case'\n': // 4.多行注釋 /*int i = 0; int j = 0; int k = 0; */int k = 0; //當讀取到的第一個字符為換行時首先輸出一個換行 fputc('\n', fOut); if (tag == C_BEGIN) //判斷是否為一個C語言注釋的開始,若是,進行轉化 { fputc('/', fOut); fputc('/', fOut); } break; default: fputc(first, fOut); break; } }while (first != EOF); //讀取到的字符不是文件結束 }
這樣子一個注釋轉換的小項目就基本完成了
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。