测试代码 /*rtyr*/ #include <iostream> using namespace std; /*class A { public: static int init() {return 22;} };*/ namespace A/*""sdfgse*/ { int init() {return 22;} } int main(void)//main { //cout<<invokeInit<<endl; cout<<"//"<<endl;//fea cout<<"/*"<<endl;/*fwwef *//这个情况无法处理 cout<<"/*"<<endl; cout<<"/**/"<<endl;/*af""we*/ system("pause"); return 0; }// 删除注释 #include <iostream> #include <fstream> #include <string> using namespace std; void trim(string& code) { string::size_type beg=0,pos,pos1,pos2,pos3,pos4,pos5,pos6,pos7; /*根据//后面出现 回车和引号的先后顺序判断, 如果 '/n' 出现在 '"'后 则不为注释*/ while((pos=code.find("//",beg))!=string::npos) { if((pos1=code.find('/n',pos))==string::npos) break; pos2=code.find('/"',pos); if(pos2<pos1) { ++beg; continue; } beg=pos; code.erase(pos,pos1-pos); } beg=0; /*根据/*前后出现 回车和引号的先后顺序判断, "/*"前,如果 '"' 出现在'/n' 后 则不为注释 "/*"后,如果 '"' 出现在'/n' 前 则不为注释 "×/"后,如果 '"' 出现在'/n' 前 则不为注释*/ while((pos=code.find("/*",beg))!=string::npos) { if((pos1=code.find("*/",pos))==string::npos) break; if((pos2=code.rfind('/"',pos))!=string::npos && (pos3=code.rfind('/n',pos))!=string::npos && (pos4=code.find('/"',pos))!=string::npos && (pos5=code.find('/n',pos))!=string::npos && (pos6=code.find('/"',pos1))!=string::npos && (pos7=code.find('/n',pos1))!=string::npos) { if(pos2>pos3 && pos4<pos5 && pos6<pos7 ) { ++beg; continue; } } beg=pos; code.erase(pos,pos1-pos+2); } } int main(void) { ifstream fin("testcode.cpp"); char ch; string code; while((ch=fin.get())!=EOF) code.push_back(ch); fin.close(); trim(code); cout<<code<<endl; system("pause"); return 0; } 好的版本 #include <stdio.h> #include <stdlib.h> /*---------------------------------------------------------------------------*/ static FILE *src = NULL; static FILE *dest = NULL; /*---------------------------------------------------------------------------*/ typedef void* (*AutomatonFuncType)(void); union FuncAddr { AutomatonFuncType func; void *addr; }; static void* FuncToAddr(AutomatonFuncType func); static AutomatonFuncType AddrToFunc(void *addr); /*---------------------------------------------------------------------------*/ unsigned char Read(void); void Write(unsigned char); /*---------------------------------------------------------------------------*/ static void* Dispatch(void); static void* Slash(void); static void* SlashSlash(void); static void* SlashStar(void); static void* SlashStarStar(void); static void* SingleQuote(void); static void* SingleQuoteBSlash(void); static void* DoubleQuote(void); static void* DoubleQuoteBSlash(void); /*---------------------------------------------------------------------------*/ void* FuncToAddr(AutomatonFuncType func) { union FuncAddr bin; bin.func = func; return bin.addr; } /*---------------------------------------------------------------------------*/ AutomatonFuncType AddrToFunc(void *addr) { union FuncAddr bin; bin.addr = addr; return bin.func; } /*---------------------------------------------------------------------------*/ unsigned char Read(void) { unsigned char ch; ch = fgetc(src); if (feof(src)) { return 0; } return ch; } /*---------------------------------------------------------------------------*/ void Write(unsigned char ch) { fputc(ch, dest); } /*---------------------------------------------------------------------------*/ void* Dispatch(void) { unsigned char ch; ch = Read(); if (!ch) { return NULL; } switch (ch) { case '/': return FuncToAddr(Slash); case '/'': Write(ch); return FuncToAddr(SingleQuote); case '"': Write(ch); return FuncToAddr(DoubleQuote); default: break; } Write(ch); return FuncToAddr(Dispatch); } /*---------------------------------------------------------------------------*/ void* Slash(void) { unsigned char ch; ch = Read(); if (!ch) { Write('/'); return NULL; } switch (ch) { case '/': return FuncToAddr(SlashSlash); case '*': return FuncToAddr(SlashStar); default: break; } Write('/'); Write(ch); return FuncToAddr(Dispatch); } /*---------------------------------------------------------------------------*/ void* SlashSlash(void) { unsigned char ch; ch = Read(); if (!ch) { return NULL; } if (ch == '/n') { Write(ch); return FuncToAddr(Dispatch); } return FuncToAddr(SlashSlash); } /*---------------------------------------------------------------------------*/ void* SlashStar(void) { unsigned char ch; ch = Read(); if (!ch) { return NULL; } if (ch == '*') { return FuncToAddr(SlashStarStar); } return FuncToAddr(SlashStar); } /*---------------------------------------------------------------------------*/ void* SlashStarStar(void) { unsigned char ch; ch = Read(); if (!ch) { return NULL; } if (ch == '/') { return FuncToAddr(Dispatch); } if (ch == '*') { return FuncToAddr(SlashStarStar); } return FuncToAddr(SlashStar); } /*---------------------------------------------------------------------------*/ void* SingleQuote(void) { unsigned char ch; ch = Read(); if (!ch) { return NULL; } Write(ch); if (ch == '//') { return FuncToAddr(SingleQuoteBSlash); } if (ch == '/'') { return FuncToAddr(Dispatch); } return FuncToAddr(SingleQuote); } /*---------------------------------------------------------------------------*/ void* SingleQuoteBSlash(void) { unsigned char ch; ch = Read(); if (!ch) { return NULL; } Write(ch); return FuncToAddr(SingleQuote); } /*---------------------------------------------------------------------------*/ void* DoubleQuote(void) { unsigned char ch; ch = Read(); if (!ch) { return NULL; } Write(ch); if (ch == '//') { return FuncToAddr(DoubleQuoteBSlash); } if (ch == '"') { return FuncToAddr(Dispatch); } return FuncToAddr(DoubleQuote); } /*---------------------------------------------------------------------------*/ void* DoubleQuoteBSlash(void) { unsigned char ch; ch = Read(); if (!ch) { return NULL; } Write(ch); return FuncToAddr(DoubleQuote); } /*---------------------------------------------------------------------------*/ /*int main(int argc, char *argv[])//命令行 { void *m; if (argc != 3) { printf("Usage: rmcmt <source> <output>/n"); goto clean; } src = fopen(argv[1], "r"); if (!src) { printf("Can't open source file./n"); goto clean; } dest = fopen(argv[2], "w"); if (!dest) { printf("Can't create or overwrite output file./n"); goto clean; } m = FuncToAddr(Dispatch); while (m) { m = AddrToFunc(m)(); } clean: if (src) { fclose(src); src = NULL; } if (dest) { fclose(dest); dest = NULL; } return 0; }*/ int main(int argc, char *argv[])//控制台 { void *m; //FILE *scr,*dest; src=fopen("testcode.cpp","r");//要打开的文件 if (!src) { printf("Can't open source file./n"); goto clean; } dest = fopen("testcode2.cpp", "w");//要保持的文件 if (!dest) { printf("Can't create or overwrite output file./n"); goto clean; } m = FuncToAddr(Dispatch); while (m) { m = AddrToFunc(m)(); } clean: if (src) { fclose(src); src = NULL; } if (dest) { fclose(dest); dest = NULL; } //getchar(); return 0; }