#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:\\Documents and Settings\\Administrator\\桌面\\remove_comment.c",
_O_RDONLY, 0);
if (fd == -1) {
return -1;
}
n = read(fd, buf, sizeof(buf));
if (n == -1 || n == 0) {
close(fd);
return -1;
}
//printf("test\n");
remove_comment(buf, n);
*(buf + n) = '\0';
printf(buf);
/***********\\\/// */
close(fd);
return 0;
}
#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:\\Documents and Settings\\Administrator\\桌面\\remove_comment.c",
_O_RDONLY, 0);
if (fd == -1) {
return -1;
}
n = read(fd, buf, sizeof(buf));
if (n == -1 || n == 0) {
close(fd);
return -1;
}
//printf("test\n");
remove_comment(buf, n);
*(buf + n) = '\0';
printf(buf);
/***********\\\/// */
close(fd);
return 0;
}