编写一个函数,实现把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;
}

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

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

去掉双斜杠注释

Description 将C程序代码中的双斜杠注释去掉。 Input 输入数据中含有一些符合C++语法的代码行。需要说明的是,为了方便...
  • phytn
  • phytn
  • 2014年11月23日 20:23
  • 2206

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

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

习题课第一次作业:1、去除C程序中的注释

1、去除C程序中的注释 总时间限制: 1000ms 内存限制: 65536kB 描述: C程序的注释用/…/来表示。请写一个程序,将输入的C程序源代码中的注释去掉,输出去掉注释之后的源代...
  • Veniversum
  • Veniversum
  • 2016年09月16日 17:00
  • 808

【C语言】编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。(辗转相除法和常规求法)

/*编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。 例如:输入传入(0 , 5)函数返回5,传入(10 , 9)函数返回1,传入(12 , 4)函数返回4 */ #includ...
  • doudouwa1234
  • doudouwa1234
  • 2015年04月05日 21:47
  • 1317

利用Shell脚本去掉C/C++源码中的注释

网络的方便,为我们提供了共享的平台。比如源码的共享,既然有了很多优秀的源码,稍加改造就能为我们所用,这也是许多开源软件的目的之一吧。好吧,改造这样的源码,第一个问题注释问题。因为源码中的注释时常并不是...
  • wustdatamining
  • wustdatamining
  • 2012年05月27日 09:42
  • 1287

面试题:编写一函数,实现把C/C++程序代码中的注释去掉

 编写一函数,实现把C/C++程序代码中的注释去掉,并把结果返回。以下代码在VC6下编译通过,并用该源代码文件测试过,成功地把其中的注释去掉。#include #include #include #i...
  • mahaifangnefu
  • mahaifangnefu
  • 2009年07月14日 19:22
  • 1885

把C/C++程序代码中的注释去掉,并返回结果

#include #include #include void remove_commit(char *buf, size_t size) { char *p, *end, c; ...
  • lydyangliu
  • lydyangliu
  • 2013年01月20日 11:58
  • 1215

C程序设计语言练习1-23 编写一个删除C语言程序中所有的注释语句

本程序运行后,将要求用户输入一个当前目录下的C源码程序文件名,读取后,将文件中的所有注释删除掉,然后另存为*_noc.ext文件,*中可以包含多个点,.ext可以为空(即没有文件扩展名)。...
  • ycjnx
  • ycjnx
  • 2017年06月23日 16:54
  • 867

用c++编写计时器的步骤及其函数代码

用c++语言编写计时器 编写过程中用到的函数: 一、void gotoxy(int x,int y)和void hoidden()函数: 1:所需的头文件include include 2:功能:将控...
  • qq_34118845
  • qq_34118845
  • 2016年03月26日 17:44
  • 1023
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编写一个函数,实现把C/C++程序代码中的注释去掉,并把结果返回。
举报原因:
原因补充:

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