将input.c中的C语言注释转换成C++注释output。
解题思路:C语言的注释用“/**/”,C++注释用“//”表示,通过无线状态机模来做这道题,首先将问题可能分成几个简单的小块:判断是否有‘/’,当有时,也要分成三种可能:‘/’后的那个字符是否是'/','*',如果是也分两种,如果不是则继续则跳过第一个'/',然后继续查找,找到“/*”时,说明是C语言风格,则继续找与“/*”相对应的“*/”如果找到则将'*'换成'/',然后跳转到未注释继续查找。如果是C++风格,则遇到'\n'时跳到不是注释,然后继续。下面是思路图:
代码实现:
#include<stdio.h> #include<stdlib.h> #include<Windows.h> #pragma warning( disable : 4996) typedef enum State //枚举把5中情况列举出来 { NOT_COMENT, //不是注释 MEBAY_COMENT, //可能注释 C_COMENT, //C语言注释 CPP_COMENT, //C++注释 MEBAYC_COMENT, //可能C语言注释 }State; enum State state=NOT_COMENT; int ch; int main(){ FILE *PIN; FILE *POUT; PIN = fopen("input.c", "r"); //打开文件 if (PIN==NULL){ perror("in: "); system("pause"); return 1; } POUT = fopen("output", "w"); //写入的文件 if (POUT == NULL){ perror("out:"); system("pause"); return 1; } while ((ch = fgetc(PIN)) != EOF){ switch (state) { case NOT_COMENT: { if (ch == '/'){ fputc(ch, POUT); state = MEBAY_COMENT; } else{ state = NOT_COMENT; fputc(ch, POUT); } }break; case MEBAY_COMENT: { if (ch == '/'){ fputc(ch, POUT); state = CPP_COMENT; } else if (ch == '*'){ fputc('/', POUT); state = C_COMENT; } else { fputc(ch, POUT); state = NOT_COMENT; } }break; case C_COMENT: { if (ch == '*') state = MEBAYC_COMENT; else{ state = C_COMENT; fputc(ch, POUT); if (ch == '\n') fprintf(POUT, "//"); //如果C语言注释为多行注释,那么换行时,要给需要注释的前面加上C语言风格注释 } } }break; case CPP_COMENT: { if (ch == '\n'){ fputc(ch, POUT); state = NOT_COMENT; } else { fputc(ch, POUT); state = CPP_COMENT; } }break; case MEBAYC_COMENT: { if (ch == '/') { state = NOT_COMENT; int nextCh = fgetc(PIN); if (nextCh != '\n') { fputc('\n', POUT); } ngetc(nextCh, PIN); } else if (ch == '*') { state = MEBAYC_COMENT; fputc('*', POUT); } else { state = C_COMENT; fputc('*', POUT); fputc(ch, POUT); } }break; } } fclose(PIN); fclose(POUT); system("pause"); }