您的位置:首页 > 编程语言 > C语言/C++

编写一个函数,实现把C/C++程序代码中的注释去掉,并把结果返回。

2012-03-29 09:59 1051 查看
#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐