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. MyBatis源码骨架分析

    源码包分析 MyBatis 源码下载地址:https://github.com/MyBatis/MyBatis-3 MyBatis源码导入过程: 下载MyBatis的源码 检查maven的版本,必须是 ...

  2. 哦!这该死的 C 语言

    前言 C 语言是一门抽象的.面向过程的语言,C 语言广泛应用于底层开发,C 语言在计算机体系中占据着不可替代的作用,可以说 C 语言是编程的基础,也就是说,不管你学习任何语言,都应该把 C 语言放在首 ...

  3. EMQ集群搭建实现高可用和负载均衡(百万级设备连接)

    一.EMQ集群搭建实现高可用和负载均衡 架构服务器规划 服务器IP 部署业务 作用 192.168.81.13 EMQTTD EMQ集群 192.168.81.22 EMQTTD EMQ集群 192. ...

  4. SpringBoot集成Nacos

    一.环境说明 1.CentOS7 2.Jdk1.8 3.Mysql5.7 4.Nacos1.3 5.SpringBoot2.3.1.RELEASE 6.Maven3.6 二.下载Nacos 1.Nac ...

  5. 微信小程序 | 模仿百思不得其姐

    微信小程序 仿百思不得姐 设备 微信开发者工具 v1.02.1901230 扩展 修复了视频点击播放不流畅的问题 修复了视频的暂停够无法播放问题 优化了部分页面 接口 首页 http://api.bu ...

  6. python条件控制语句要注意什么?本文详解

    1.条件判断语句(if语句) 执⾏的流程:if语句在执⾏时,会先对条件表达式进⾏求值判断, 如果为True,则执⾏if后的语句 如果为False,则不执⾏ 语法: if 条件表达式 : 代码块 代码块 ...

  7. kali一些基础工具

    目录 netcat netcat https://blog.csdn.net/fageweiketang/article/details/82833193 网络工具当中的瑞士军刀 -nc指令,nc可以 ...

  8. 交互平台 - Processing - 开发模板(仿Openframeworks)

    之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/62425251

  9. 破晓行动----带你总结JVM的知识大全(二)

    JVM运行时内存 + 垃圾回收与算法

  10. Jquery的一键上传组件OCUpload及POI解析Excel文件

    第一步:将js文件引入页面 <script type="text/javascript" src="${pageContext.request.contextPat ...