注视转换 将C风格注释转换为C++风格

    xiaoxiao2021-03-25  124

    C注释风格:/* */ C++注释风格: //

    主要便是

    CommentConvert .h

    #ifndef __COMMENT_H__ #define __COMMENT_H__ #include<stdio.h> enum STATE { NUL_STATE, C_STATE, CPP_STATE, END_STATE }; void DoCState(FILE*pfIn, FILE* pfOut); void DoCppState(FILE* pfIn, FILE* pfOut); void DoNulState(FILE* pfIn, FILE* pfOut); void DoConvertWork(FILE* pfIn, FILE* pfOut); #endif //__COMMENT_H__

    CommentConvert .c

    #define _CRT_SECURE_NO_WARNINGS 1 #include"CommentConvert.h" static enum STATE state = NUL_STATE; void DoNulState(FILE* pfIn, FILE* pfOut) { int first = fgetc(pfIn); int second = 0; switch (first) { case '/': second = fgetc(pfIn); if (second == '/') //C++注释 { fputc(first, pfOut); fputc(second, pfOut); state = CPP_STATE; } else if (second == '*') //C注释 { fputc('/', pfOut); fputc('/', pfOut); state = C_STATE; } else { fputc(first, pfOut); fputc(second, pfOut); } break; case EOF: //文件结束 state = END_STATE; break; default: fputc(first, pfOut); break; } } void DoCState(FILE*pfIn, FILE* pfOut) { int first = fgetc(pfIn); int second = 0; int third = 0; switch (first) { case '*': second = fgetc(pfIn); switch (second) { case '/': //C注释结束 third = fgetc(pfIn); if (third != '\n') //如果后面没有换行符,则加一个换行符 { fputc('\n', pfOut); } if (third == '/') { ungetc(third, pfIn); //字符返回函数:将读出的数据再次放回到缓冲区去,下一次读数据时,仍然读出来。 state = NUL_STATE; break; //连续注释问题 /* *//* */ } fputc(third, pfOut); state = NUL_STATE; break; case '*': fputc(first, pfOut); third = fgetc(pfIn); if (third == '/') { state = NUL_STATE; } break; default: fputc(first, pfOut); } break; case '\n': fputc(first, pfOut); fputc('/', pfOut); fputc('/', pfOut); break; case EOF: state = END_STATE; break; default: fputc(first, pfOut); break; } } void DoCppState(FILE* pfIn, FILE* pfOut) { int first = fgetc(pfIn); switch (first) { case '\n': fputc(first, pfOut); state = NUL_STATE; break; case EOF: state = END_STATE; break; default: fputc(first, pfOut); break; } } void DoConvertWork(FILE* pfIn, FILE* pfOut) { while (state != END_STATE) { switch (state) { case C_STATE: DoCState(pfIn, pfOut); break; case CPP_STATE: DoCppState(pfIn, pfOut); break; case NUL_STATE: DoNulState(pfIn, pfOut); break; default: break; } } }

    test .c

    #define _CRT_SECURE_NO_WARNINGS 1 #include"CommentConvert.h" int main() { FILE *fRead = NULL; FILE *fWrite = NULL; printf("注释转换开始\n"); fRead = fopen("input.c", "r"); if (fRead == NULL) { perror("open file for read"); } fWrite = fopen("output.c", "w"); if (fWrite == NULL) { fclose(fRead); perror("open file for write"); } DoConvertWork(fRead, fWrite); fclose(fRead); fclose(fWrite); printf("注释转换结束\n"); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-9826.html

    最新回复(0)