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++; /* 跳过转义位置,因为转义字符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语言版去除源代码注释的更多相关文章
- Microsoft源代码注释语言(SAL)提供设置批注
Microsoft源代码注释语言(SAL)提供设置批注可以使用描述的功能如何使用其参数,它对其假设并确保它使其在完成. 批注可标头文件 <sal.h>定义. Visual Studio C ...
- DevOps:怎么实现源代码注释和系统文档的自动化更新?
[编者按]计算机软件传统定义为:软件是计算机系统中与硬件相依存的另一部分,软件包括程序.数据及其相关文档的完整集合.然而在时下的开发中,文档的合规性往往被忽视的干干净净.本文由 Todd Waits ...
- 基于gSOAP使用头文件的C语言版web service开发过程例子
基于gSOAP使用头文件的C语言版web service开发过程例子 一服务端 1 打开VS2005,创建一个工程,命名为calcServer. 2 添加一个头文件calc.h,编辑内容如下: 1// ...
- CentOS-6.4-minimal版中源代码安装MySQL-5.5.38
完整版见https://jadyer.github.io/2014/09/29/centos-install-mysql/ /** * CentOS-6.4-minimal版中源代码安装MySQL-5 ...
- 基于BP神经网络的简单字符识别算法自小结(C语言版)
本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:gzzaigcn2009@163.com 写在前面的闲话: 自我感觉自己应该不是一个非常 ...
- c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...
- GeoIP的使用-C语言版
0x00. 简介 GeoIP库可以根据IP地址(支持IPv4 和 IPv6), 定位该IP所在的 洲.经纬度.国家.省市.ASN 等信息. GeoIP目前已经升级到GeoIP2,GeoIP2有两个版本 ...
- libnode 0.4.0 发布,C++ 语言版的 Node.js
libnode 0.4.0 支持 Windows ,提升了性能,libuv 更新到 0.10.17 版本,libj 更新到 0.8.2 版本. libnode 是 C++ 语言版的 Node.js,和 ...
- md5加密算法c语言版
from: http://blog.sina.com.cn/s/blog_693de6100101kcu6.html 注:以下是md5加密算法c语言版(16/32位) ---------------- ...
随机推荐
- Life is not the amount of breath you take.
It's the moments that take you breath away.
- leetcode刷题-54螺旋矩阵
题目 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 思路 对于每个外层,从左上方开始以顺时针的顺序遍历所有元素.假设当前层的左上角位于(to ...
- Apache Jmter 压力测试教程
1.官网下载安装包,地址:http://jmeter.apache.org/download_jmeter. 2.下载得到解压包,双击解压. 3.点击/bin目录下面的jmeter.bat 启动软件 ...
- linux下部署python项目到jenkins
环境:linux+jenkins+tomcat+git+python3.7 1.安装jdk 上传安装包到usr/local 解压 配置环境变量 vim /etc/profile export JAVA ...
- 【高并发】Redis如何助力高并发秒杀系统,看完这篇我彻底懂了!!
写在前面 之前,我们在<[高并发]高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!>一文中,详细讲解了高并发秒杀系统的架构设计,其中,我们介绍了可以使用Redis存储秒杀商品的库存数量.很 ...
- Dos拒绝服务Sockstress/TearDrop 泪滴攻击(二)
Sockstress放大攻击原理:攻击者向目标发送一个很小的流量,但是会造成产生的攻击流量是一个巨大的.成百上千倍上万倍流量被放大的一个效果,才适合作为一个拒绝服务攻击效果.(实现攻击者很小的流量打垮 ...
- mini logger for c++
水平太菜,最近捣鼓这个 log,折腾了好一会.由于之前都是用 std::cout,不能满足同时输出到屏与文件的目的,故经过一番搜索,在stackoverflow 找到了答案,现总结如下: 头文件 lo ...
- Hadoop入门学习整理(一)
今天是2020年4月8日,是一个平凡而又特殊的日子,武汉在经历了77天的封城之后,于今日0点正式解封.从1月14日放寒假离开武汉,到今天已近3个月,学校的花开了又谢了.随着疫情好转,春回大地,万物复苏 ...
- express 4.0 connect-mongo 运行时报错的解决方法
如果使用的是express 4.0,且入口文件app.js的模板引入和中间件配置如下 如果你的package.json文件中有以下版本信息 报出的错误如下所示 或者 那么只需修改app.js中 ...
- JS 数组, 对象的增查改删(多语法对比)
数据结构横向对比, 增, 查, 改, 删 建议: 在用数据结构的时候, 优先考虑Map和Set(考虑数据的唯一性), 放弃传统的数组和Object, 特别是比较复杂的数据结构时 数组 Map与Arra ...