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

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值