如何删除C/C++源代码中的注释

具体代码:

#include <stdlib.h> 
#include <stdio.h> 


//删除注释 
void commentFilter(FILE* sourceFile,FILE* objectFile) 

char ch; 
int flag=1; 
bool read = true; //是否可读取,默认为可以 

fseek(sourceFile,0,SEEK_END); //定位 

int len = (int)ftell(sourceFile); //获得文件总字符长度 

//逐个读取文件中的字符 
for(int cursor=0;cursor<len;cursor++) 

fseek(sourceFile,cursor,SEEK_SET); 
ch = getc(sourceFile); 


switch(ch) 

//如果遇到双引号,则先将双引号之间的字符写入目标文件 
case '"': 

if(read) //不是在注释行之内 

putc(ch,objectFile);//写入目标文件 
putchar(ch); //输出到控制台 

++cursor; 
fseek(sourceFile,cursor,SEEK_SET); 
char c = getc(sourceFile); 

for(;c != '"';) 

putc(c,objectFile); 
putchar(c); 

cursor++; 
fseek(sourceFile,cursor,SEEK_SET); 
c = getc(sourceFile); 

break; 

else 
break; 


case '/' : 

if(read) 

++cursor; 
fseek(sourceFile,cursor,SEEK_SET); //定位到下一个字符,判断是否依然为'/'或'*' 
char c = getc(sourceFile); 

if(c == '/'){read=false;flag=1;break;}//flag=1,表示遇到的是以//开头的注释 
if(c == '*'){read=false;flag=2;break;}//flag=2,表示遇到的是以/*开头的注释 
else {--cursor;break;} 

else 
break; 


case '*' : 

if(!read) //之前是注释行 

++cursor; 
fseek(sourceFile,cursor,SEEK_SET); 
char c = getc(sourceFile); 

if(c == '/' && flag == 2)//下一个是'/'且为第二种注释 

++cursor; 
fseek(sourceFile,cursor,SEEK_SET); 
ch = getc(sourceFile); 
read = true; 

else 
{--cursor;break;} 

else 
break; 



case ' ' : 

if(!read && flag!=2) 
read = true; 

//判断下一行是否为空行,如果是则直接忽略 
++cursor; 
fseek(sourceFile,cursor,SEEK_SET); 
char c = getc(sourceFile); 

if(c != ' ') //不是则将cursor还原 
--cursor; 
break; 

default: 
break; 


if(read) //将读取到的字符写入目标文件及输出到控制台 

putchar(ch); 
putc(ch,objectFile); 






int main() 

FILE* sourceFile,* objectFile;//源文件,目标文件 

char sourceName[20],objectName[20];//源文件名,目标文件名 

gets(sourceName); 
gets(objectName); 

sourceFile = fopen(sourceName,"r"); 
objectFile = fopen(objectName,"w"); 

commentFilter(sourceFile,objectFile); 

return 0; 



 
原文地址:https://www.cnblogs.com/hisheng/p/6134979.html