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

转载 2012年03月29日 09:59: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:\\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;
}

数据库的数据抽象、实例、模式

数据抽象主要是为了向用户屏蔽复杂性。一共分为三层:1,物理层,物理层的数据抽象主要描述了数据在物理层面是怎么存储的数据,这主要是数据库的供应商来研究的。2,逻辑层,逻辑层的数据抽象主要描述了数据库中存...

机器学习笔记五:广义线性模型(GLM)

一.指数分布族在前面的笔记四里面,线性回归的模型中,我们有,而在logistic回归的模型里面,有。事实上,这两个分布都是指数分布族中的两个特殊的模型。所以,接下来会仔细讨论一下指数分布族的一些特点,...

关于程序员面试宝典中5.8节面试例题:编写一个函数,实现把C/C++程序代码中的注释去掉……答案的分析

因为马上要找工作了,所以,没事要看看程序员面试宝典,今天看到第5.8节(P41)程序设计的其他问题,自己思考了一下,然后看了看附带的答案,发现答案都看不太懂(大家都懂看别人的程序,没有注释,会看的很纠...
  • ljjee
  • ljjee
  • 2012年07月16日 16:08
  • 1801

去掉C/C++程序代码中的注释

程序员面试宝典上面的题目有很多是很经典的问题,可供我们思考,而且会对我们面试有很大好处。 下面是第45页的一个题目:编写一个函数,实现把C/C++程序代码中的注释去掉,我开始看的时候总是看不懂,...

去掉C/C++程序代码中的注释

程序员面试宝典上面的题目有很多是很经典的问题,可供我们思考,而且会对我们面试有很大好处。 下面是第45页的一个题目:编写一个函数,实现把C/C++程序代码中的注释去掉,我开始看的时候总是看不懂,...
  • taoqick
  • taoqick
  • 2014年05月18日 16:24
  • 954

《程序员面试宝典》移除C/C++程序代码中的注释

最近在看《程序员面试宝典》,受益匪浅,这篇文章是5.8节的代码,加了我的注释,还规范了代码,共享之。 (*^__^*) …… #include #include #include #inclu...

编写程序将C / C++代码中的注释去掉

今天看到一道题,觉得可以拿来锻炼一下。就自己做了一遍。原题链接:关于程序员面试宝典中5.8节面试例题:编写一个函数,实现把C/C++程序代码中的注释去掉/***********************...

C程序代码中内嵌as汇编(四、宏函数)

先来回忆下C语言中宏是怎么定义的,最基本的是定义常量:#define MAX_LEN 1024  这是最简单的常数宏定义,其中宏名按规定是要大写的,宏名在预编译时会由后面的值替代掉(预编译四大步骤:1...

c/c++里的 堆区 栈区 静态区 文字常量区 程序代码区

一个由C/C++编译的程序占用的内存分为以下几个部分   1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。      栈(s...

C/C++编译程序的内存分配(栈,堆,全局区,文字常量区,程序代码区)

栈: 由程序自动分配和释放,非全局变量或静态变量,以及非malloc申请的空间,都在栈中。 堆: 由程序员申请的内存空间: malloc, 在堆中申请的内存需要自己释放,malloc与free成对 全...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编写一个函数,实现把C/C++程序代码中的注释去掉,并把结果返回。
举报原因:
原因补充:

(最多只允许输入30个字)