C++去掉注释

来源:互联网 发布:飞鸽传书 软件 编辑:程序博客网 时间:2024/06/05 02:22
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>


/*****
 *功能:移除C/C++程序代码中的注释
 *
 *输入:指向C/C++程序代码的指针


 */


void remove_comment(char *buf,size_t size)
{
char *p,*end,c;
//单引号,双引号,单行注释,多行注释
char *sq_start,*dq_start;
char *lc_start,*bc_start;
size_t len;


p=buf;
end = p+size;
sq_start= NULL;
dq_start=NULL;


lc_start=NULL;
bc_start=NULL;


while (p<end)
{
c=*p;
switch(c)
{
case '\'':
if (dq_start || lc_start || bc_start)
{


//忽略字符串与注释中的单引号
p++;
continue;
}
if(sq_start == NULL)
{


sq_start = p++;
}
else 
{
len==p++- sq_start;
}
if (len == 2 && *(sq_start+1)== '\\')
{


//忽略字符串中的单引号
continue;
}


sq_start =NULL;
break;
case '\"':   //双引号
if (sq_start || lc_start || bc_start)
{
//忽略字符或注释中的双引号
p++;
continue;
}


if (dq_start ==NULL)
{
dq_start = p++;
}
else
{


if (*(p++ -1)== '\\')
{


//忽略字符串中的双引号
continue;
}
dq_start = NULL;
}
break;


case '/':
if (sq_start || dq_start ||lc_start ||bc_start)
{


//忽略字符,字符串或注释中的斜杠
p++;
continue;


}
c = *(p+1);

if (c=='/')
{
lc_start = p;
p+=2;


}
else if (c=='*') 
{
bc_start = p;
p += 2;
}
else
{


//忽略除号
p++;
}
break;


case '*':
if (sq_start || dq_start || lc_start ||bc_start ==NULL)
{
//忽略字符、字符串或行注释中的星号,还有忽略乘号
p++;
continue;
}


if ( *(p+1) != '/')
{
//忽略块注释中的星号
p++;
continue;
}
p+=2;
memset(bc_start,' ',p-bc_start);
bc_start =NULL;
break;


case '\n':
if (lc_start ==NULL)
{
p++;
continue;
}


c=*(p+1);
memset(lc_start,' ',(c == '\r'?(p++ -1) : p++)-lc_start);
lc_start = NULL;


break;
default:
p++;
break;
}
}

if (lc_start)
{
memset(lc_start,' ',p-lc_start);
}


}




int main(int argc ,char * argv[])
{


int fd,n;
char buf[102400];
fd = open("C:\\uuu.txt",_O_RDONLY,0);
if (fd==-1)
{
return -1;
}


n = read(fd,buf,sizeof(buf));
if (n==-1 || n==0)
{
close(fd);
return -1;
}


remove_comment(buf,n);
*(buf+n) = '\0';
printf(buf);


close(fd);
return 0;


}