去除C/C++代码中的注释(将注释换为空格)
// RemoveComments.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <fstream> #include <string.h> using namespace std; void removeComments(char* buf,int n); int main(int argc, char* argv[]) { // printf("Hello World!\n"); string filename = "FileWithComments.cpp"; ifstream fin; int length; char * buffer; try{ fin.open(filename.c_str()); }catch (std::exception &e) { cout<<e.what()<<endl; } if (fin.is_open()) { cout<<"Success!"<<endl; fin.seekg(0,std::ios::end); length = fin.tellg(); fin.seekg(0,std::ios::beg); buffer = new char[length]; fin.read(buffer,length); fin.close(); buffer[length-1]='\0'; cout<<buffer<<endl; removeComments(buffer,length); cout<<"---------------------------------------"<<endl; cout<<buffer<<endl; } return 0; } void removeComments(char* buf,int n) { char c; char *p,*end;//p遍历字符串,end是终点 char *sy,*dy;//sy标志双引号,dy标志单引号 char *xg;//xg标志斜杠/ char *xgx,*xxg;//xgx标志/*,xxg标志*/ sy=dy=xg=xgx=xxg=NULL; p = buf; end = p + n; while (p<end) { c = *p; switch(c) { case '"'://记录双引号出现的位置 { if (sy==NULL&&dy==NULL) { sy = p; }else{ sy = NULL; } p++; }break; case '\''://记录单引号出现的位置 { if (dy==NULL&&sy==NULL) { dy = p; }else{ dy = NULL; } p++; }break; case '/': { if (sy==NULL&&dy==NULL) { p++; char c_temp = *p; if (c_temp=='/') {//当前遇到的是"//" *p=' '; *(p-1)=' '; p++; while (*p!='\n') { *p=' '; p++; } /*//"""""''''' * */ }else if (c_temp=='*') {//当前遇到的是"/*" *p=' '; *(p-1)=' '; p++; xgx = p; while (true) { if (*p=='*'&&*(p+1)=='/') { *p=' '; p++; *p=' '; break; } *p=' '; p++; } }else{ //nothing } } p++; }break; default: { p++; }break; } } }