编写一函数,实现把C/C++程序代码中的注释去掉,并把结果返回。 以下代码在VC6下编译通过,并用该源代码文件测试过,成功地把其中的注释去掉。 #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 ' ': /**//* 换行符 */ if (lc_start == NULL) ...{ p++; continue; } c = *(p - 1); memset(lc_start, ' ', (c == ' ' ? (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 "); remove_comment(buf, n); *(buf + n) = '/0'; printf(buf); close(fd); return 0; } 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ngwsx/archive/2008/04/04/2250186.aspx