1. 去除代码中注释需要注意下面几点
    首先注释有”/*”开始到”*/”结束的多行或单行注释
    其次还有”//”这种单行注释
    另外还需要注意双引号和单引号内的字符不要算到注释中
  2. 因此我设计以下程序
    当遇到”“双引号和”“时需要跳过整个字符串,特别注意字符串和字符内部转义字符。
    当遇到”/“斜杠时,匹配下一个为星号还是斜杠,如果下一个是斜杠则直接跳到本行结尾。如果是星号则匹配”*/
  3. 下面是源代码,没啥特别的
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h> /**
* 去掉字符串中注释部分
**/
void remove_comment(char *buf)
{
size_t off;
char *s, *p, *t, *tmp;
char *sss="adas\"d/**/\"*a\"//s/**/d*/"; // 这里主要测试字符串内带注释字符 for (s = p = buf; *p != '\0'; p++) {
switch(*p) {
case '"': // 直接循环到下一个 "
case '\'': /* 直接循环到下一个 ' */
// 下面找到字符串结束位置,避免匹配字符串内部的 /* 或者 //
for (tmp = p + 1; *tmp != *p; tmp++) {
if (*tmp == '\\') {
tmp++; /* 跳过转义位置,因为转义字符2个位置代表一个字符 */
}
}//阿萨德撒 // while(1) {
// if ( NULL != (t = strchr(tmp, '\\')) ) {
// printf("%c\n", *tmp);
// tmp = t + 2; // 有转义字符
// }
// if ( NULL != (t = strchr(tmp, *p)) ) {
// tmp = t + 1; // 有要找的字符
// break;
// }
// }
// printf("%c\n", *(tmp-2));
// exit(0);
// while ( NULL != (t = strchr(tmp, *p)) ) {
// tmp = t + 1; /*每次都从下一个位置找*/
// if ( *(t - 1) != '\\' ) {
// break; // 这次的符号不是转义,则表示找到真正字符串末尾了
// }
// } off = tmp - p+1/* 计算本次拷贝长度 */;
if (off > 1) {
strncpy(s, p, off);
p += off - 1; // 外面有一个p++,所以这里少加一个
s += off;
}
break; case '/':
switch ( *(p + 1) ) {
case '*': // 组成 /*
if (NULL != (t = strstr(p + 1, "*/"))) {
p = t + 1; /* 这里把指针指向 /* 结束标记 */
}
break; case '/': // 组成 //
for (tmp = p - 1; 0 != isspace(*tmp); tmp--) {
} // /* 这里的循环用于去掉空行注释
s -= p - tmp - 1; // s倒退到上一个非空白字符
*s++ = '\n'; /* //是单行注释,因此必须有一个换行 */ while (*p != '\n' && *p != '\r') {
p++;// p指针移到下一个回车换行
}
break; default: // 没有匹配注释字符
*s++ = *p;
break;
}
break; default: // 没有匹配字符则逐个写
*s++ = *p;
break;
}
} *s = '\0'; // 写结束标记
} /**
* 因为一个源码文件最大也就几M
* 所以全部读到内存处理,绰绰有余的
* 这里是多行注释,去掉后会有一个回车
* 及多行注释缩短为一行
**/
int main(int argc, char *argv[])
{
if (argc != 2) { /* 传递参数不正确 */
printf("Usage : %s file.c\n", argv[0]);
return -1;
}
const char *filename = argv[1]; // 得到文件名 struct stat statbuff; /* 得到文件信息结构体 */
if(stat(filename, &statbuff) < 0){
return -1; // 获取文件大小失败
} off_t filesize = statbuff.st_size; // 缓存文件大小
char *fileBuff = (char *)malloc(sizeof(char) * filesize); int fd = open(filename, O_RDONLY);
if (-1 == fd) {
printf("open %s : %s\n", filename, strerror(errno));
return errno;
} ssize_t n = read(fd, fileBuff, filesize);
if (n <= 0) { // 读取错误或空文件,直接关闭文件并退出
close(fd);
return -1;
} *(fileBuff + n) = '\0'; /* 加上结束符 */
remove_comment(/* 直接把参数分成2半咯 */fileBuff); // 去除注释
printf("%s\n", fileBuff); /* 打印结果 */ close(fd);
return 0;
}

4.下面演示一下功能,将上面的文件保存为main.c,执行
gcc main.c && .\a.exe main.c

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h> void remove_comment(char *buf)
{
size_t off;
char *s, *p, *t, *tmp;
char *sss="adas\"d/**/\"*a\"//s/**/d*/"; for (s = p = buf; *p != '\0'; p++) {
switch(*p) {
case '"':
case '\'':
for (tmp = p + 1; *tmp != *p; tmp++) {
if (*tmp == '\\') {
tmp++;
}
} off = tmp - p+1;
if (off > 1) {
strncpy(s, p, off);
p += off - 1;
s += off;
}
break; case '/':
switch ( *(p + 1) ) {
case '*':
if (NULL != (t = strstr(p + 1, "*/"))) {
p = t + 1;
}
break; case '/':
for (tmp = p - 1; 0 != isspace(*tmp); tmp--) {
}
s -= p - tmp - 1;
*s++ = '\n'; while (*p != '\n' && *p != '\r') {
p++;
}
break; default:
*s++ = *p;
break;
}
break; default:
*s++ = *p;
break;
}
} *s = '\0';
} int main(int argc, char *argv[])
{
if (argc != 2) {
printf("Usage : %s file.c\n", argv[0]);
return -1;
}
const char *filename = argv[1]; struct stat statbuff;
if(stat(filename, &statbuff) < 0){
return -1;
} off_t filesize = statbuff.st_size;
char *fileBuff = (char *)malloc(sizeof(char) * filesize); int fd = open(filename, O_RDONLY);
if (-1 == fd) {
printf("open %s : %s\n", filename, strerror(errno));
return errno;
} ssize_t n = read(fd, fileBuff, filesize);
if (n <= 0) {
close(fd);
return -1;
} *(fileBuff + n) = '\0';
remove_comment(fileBuff);
printf("%s\n", fileBuff); close(fd);
return 0;
}

c语言版去除源代码注释的更多相关文章

  1. Microsoft源代码注释语言(SAL)提供设置批注

    Microsoft源代码注释语言(SAL)提供设置批注可以使用描述的功能如何使用其参数,它对其假设并确保它使其在完成. 批注可标头文件 <sal.h>定义. Visual Studio C ...

  2. DevOps:怎么实现源代码注释和系统文档的自动化更新?

    [编者按]计算机软件传统定义为:软件是计算机系统中与硬件相依存的另一部分,软件包括程序.数据及其相关文档的完整集合.然而在时下的开发中,文档的合规性往往被忽视的干干净净.本文由 Todd Waits ...

  3. 基于gSOAP使用头文件的C语言版web service开发过程例子

    基于gSOAP使用头文件的C语言版web service开发过程例子 一服务端 1 打开VS2005,创建一个工程,命名为calcServer. 2 添加一个头文件calc.h,编辑内容如下: 1// ...

  4. CentOS-6.4-minimal版中源代码安装MySQL-5.5.38

    完整版见https://jadyer.github.io/2014/09/29/centos-install-mysql/ /** * CentOS-6.4-minimal版中源代码安装MySQL-5 ...

  5. 基于BP神经网络的简单字符识别算法自小结(C语言版)

    本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:gzzaigcn2009@163.com 写在前面的闲话: 自我感觉自己应该不是一个非常 ...

  6. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  7. GeoIP的使用-C语言版

    0x00. 简介 GeoIP库可以根据IP地址(支持IPv4 和 IPv6), 定位该IP所在的 洲.经纬度.国家.省市.ASN 等信息. GeoIP目前已经升级到GeoIP2,GeoIP2有两个版本 ...

  8. libnode 0.4.0 发布,C++ 语言版的 Node.js

    libnode 0.4.0 支持 Windows ,提升了性能,libuv 更新到 0.10.17 版本,libj 更新到 0.8.2 版本. libnode 是 C++ 语言版的 Node.js,和 ...

  9. md5加密算法c语言版

    from: http://blog.sina.com.cn/s/blog_693de6100101kcu6.html 注:以下是md5加密算法c语言版(16/32位) ---------------- ...

随机推荐

  1. Mysql数据库扩展

    安装跟卸载 Mysql安装 下载Mysql源安装包 1   wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.r ...

  2. Java得到指定日期的时间

    //得到指定日期(几天前/几天后)整数往后推,负数往前移动private Date getAppointDay(int num) throws ParseException { DateFormat ...

  3. java安全编码指南之:Number操作

    目录 简介 Number的范围 区分位运算和算数运算 注意不要使用0作为除数 兼容C++的无符号整数类型 NAN和INFINITY 不要使用float或者double作为循环的计数器 BigDecim ...

  4. pwnable.kr之passcode

    使用ssh passcode@pwnable.kr -p2222登录到远程服务器, ls -l 查看目录下的文件, -r--r----- root passcode_pwn Jun flag -r-x ...

  5. (006)增加Blazor WebAssembly子站,推荐一个可视化linux ssh客户端FinalShell

    增加一个Blazor WebAssembly子站,并添加来回链接. 同时推荐一个好用的ssh客户端:FinalShell,windows用户再也不怕linux黑窗口不会用了:) * 支持直接命令行; ...

  6. 逐浪CMS最新V8.1.6 Beta版安装部署操作

    首先要获得内部最新版本的CMS,官网有公开发布版本,但不属于内部最新的,内部最新的CMS系统是不断的有功能的迭代更新. 操作系统建议是win10.1.windows server2012\2016\2 ...

  7. 说说XcodeLLDB调试的那些事儿

    使用场景之一,接收他人的项目,快速理清其层次结构,可以打标识符断点,如下图 每一个VC,都加了个在viewDidLoad方法处的断点,这样运行程序时,逐步断点,便可以理清层次, 但是,需要手动不断的继 ...

  8. HTML自学第一篇

    教程来自W3CSchool 因为笔者有过开发经验 本篇只是个人对HTML自学的笔记,可能不适合用于给他人理解和学习 什么是 HTML HTML 指的是超文本标记语言 (Hyper Text Marku ...

  9. 关于浏览器访问iLO报错ERR_SSL_BAD_RECORD_MAC_ALERT

    公司有几台HP DL380 G7服务器,ilo版本是ilo3(Integrated Lights-Out 3),ilo口配置好后,无法正常打开ilo页面 ping ilo口是通的,并且telnet 8 ...

  10. C语言实现顺序表的基本操作(从键盘输入 生成线性表,读txt文件生成线性表和数组生成线性表----三种写法)

    经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1. 线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2. 采用的实现方式:一段地 ...