C語言小專案——註釋轉換
阿新 • • 發佈:2018-11-02
我們要測試幾種情況,將一些.c檔案裡的C語言註釋轉換成c++語言註釋。
commentconvert.h
#ifndef __COMMENTCONVERT_H__ #define __COMMENTCONVERT_H__ #include<stdio.h> #include<stdlib.h> enum State { NUL_STATE,//無註釋狀態 C_STATE,//C註釋狀態 CPP_STATE,//C++註釋狀態 END_STATE //結束狀態 }; void DoNulState(FILE *pfIn, FILE *pfOut, enum State *state); void DoCState(FILE *pfIn, FILE *pfOut, enum State *state); void DoCppState(FILE *pfIn, FILE *pfOut, enum State *state); void commentconvert(FILE* pfIn, FILE* pfOut); #endif //__COMMENTCONVERT_H__
test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"commentconvert.h" void test() { FILE* pfIn; FILE* pfOut; pfIn = fopen("Input.c", "r"); if (pfIn == NULL) { perror("the file for read"); exit(EXIT_FAILURE); } pfOut = fopen("Output.c", "w"); if (pfOut == NULL) { perror("the file for read"); fclose(pfIn); pfIn = NULL; exit(EXIT_FAILURE); } commentconvert(pfIn, pfOut); fclose(pfOut); pfOut = NULL; } int main() { test(); system("pause"); return 0; }
commentconvert.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"commentconvert.h" void DoNulState(FILE *pfIn, FILE *pfOut, enum State *state) { int first = fgetc(pfIn); switch (first) { case '/': { int second = fgetc(pfIn); switch (second) { case '*': { fputc('/', pfOut); fputc('/', pfOut); *state = C_STATE; } break; case '/': { fputc(first, pfOut); fputc(second, pfOut); *state = CPP_STATE; } break; case EOF: { fputc(first, pfOut); *state = END_STATE; } break; default: { fputc(first, pfOut); fputc(second, pfOut); } break; } } break; case EOF: *state = END_STATE; break; default: fputc(first, pfOut); break; } } void DoCState(FILE *pfIn, FILE *pfOut, enum State *state) { int first = fgetc(pfIn); switch (first) { case '*': { int second = fgetc(pfIn); switch (second) { case '/': { int third = fgetc(pfIn); switch (third) { case '\n': fputc('\n', pfOut); *state = NUL_STATE; break; case '/': fputc(first, pfOut); fputc(second, pfOut); fputc(third, pfOut); *state = C_STATE; break; default: fputc('\n', pfOut); fputc(third, pfOut); *state = NUL_STATE; break; } } //fputc('\n', pfOut); //*state = NUL_STATE; break; default: fputc(first, pfOut); ungetc(second, pfIn); break; } } break; case '\n': { fputc('\n', pfOut); fputc('/', pfOut); fputc('/', pfOut); *state = C_STATE; } break; case EOF: *state = END_STATE; break; default: fputc(first, pfOut); break; } } void DoCppState(FILE *pfIn, FILE *pfOut, enum State *state) { int first = fgetc(pfIn); switch (first) { case '\n': { fputc('\n', pfOut); *state = NUL_STATE; } break; case EOF: *state = END_STATE; break; default: fputc(first, pfOut); break; } } void commentconvert(FILE* pfIn, FILE* pfOut) { 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; default: break; } } }
以下是此程式碼測試的幾種情況: