开源一个小程序,删除C源代码里的注释!
本帖最后由 zouzhichao 于 2014-1-4 17:45 编辑自己写的,用来删除C源代码文件的注释,刚写完还热乎着,Ubuntu GCC 编译通过,做了简单测试,还不能保证无BUG,先贴代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef signed short int16_t;
typedef unsigned short uint16_t;
typedef signed int int32_t;
typedef unsigned int uint32_t;
typedef float flt_t;
typedef double lflt_t;
/*********************************************************************************
* 此处有一个逻辑锁,三种状态:正常模式,注释模式,字符串模式
* 1,一旦进入注释模式,必须结束注释模式才能进入别的模式,此间所有代码不输出
* 2,一旦进入字符串模式,必须结束字符串模式才能进入别的模式,此间所有代码输出
* 3,正常模式下,检测最先进入那个模式
*********************************************************************************/
int8_t _note_clr_(const int8_t* file_path_src, const int8_t* file_path_dst)
{
enum MODE{_MODE_NORMAL_, _MODE_NOTE_, _MODE_STR_};
uint8_t mode; // 注释状态标志,字符串状态标志位
FILE* file_src; // 源文件
FILE* file_dst; // 目标文件
int8_t buffer; // 文件缓存区,单行最多支持512个字符
int8_t* buffer_beg; // 字符串起始地址
int8_t* buffer_temp1; // 字符串指针1,用于查找
int8_t* buffer_temp2; // 字符串指针2,用于查找
int8_t* buffer_temp3; // 字符串指针3,用于查找
file_src = fopen(file_path_src, "r"); // 打开源文件
if (NULL == file_src)
{
printf("error = 0!");
return -1; // 源文件打开失败,返回-1
}
file_dst = fopen(file_path_dst, "w"); // 打开目标文件
if (NULL == file_dst)
{
printf("error = 1!");
fclose(file_src); // 目标文件打开失败,关闭源文件
return -1; // 目标文件打开失败,返回-1
}
if (NULL == fgets((int8_t*)buffer, 512, file_src))
{
fclose(file_src); // 关闭源文件
fclose(file_dst); // 关闭目标文件
return -1;
}
for (mode = _MODE_NORMAL_, buffer_beg = (int8_t*)buffer; ; )
{
if (_MODE_NOTE_ == mode) // 注释模式
{
buffer_temp1 = (int8_t*)strstr((const int8_t*)buffer_beg, (const int8_t*)"*/"); // 查找"*/"
if (NULL != buffer_temp1) // 如果找到了
{
buffer_beg = buffer_temp1 + 2; // 找到新的起始点
mode = _MODE_NORMAL_; // 进入正常模式
continue;
}
}
else if (_MODE_STR_ == mode)
{
buffer_temp1 = (int8_t*)strstr((const int8_t*)buffer_beg, (const int8_t*)"\"");
if (NULL != buffer_temp1) // 如果找到了
{
if (buffer_temp1 == buffer_beg)
{
mode = _MODE_NORMAL_; // 进入正常模式
}
else if ('\\' != *(buffer_temp1 - 1))
{
mode = _MODE_NORMAL_; // 进入正常模式
}
*buffer_temp1 = '\0'; // 截取有效字符串
fprintf(file_dst, (const int8_t*)"%s\"", (const int8_t*)buffer_beg); // 输出有效字符串
buffer_beg = buffer_temp1 + 1; // 找到新的起始点
continue;
}
}
else if (_MODE_NORMAL_ == mode)
{
buffer_temp1 = (int8_t*)strstr((const int8_t*)buffer_beg, (const int8_t*)"/*");
buffer_temp2 = (int8_t*)strstr((const int8_t*)buffer_beg, (const int8_t*)"\"");
buffer_temp3 = (int8_t*)strstr((const int8_t*)buffer_beg, (const int8_t*)"//");
if ((NULL != buffer_temp1) && ((buffer_temp1 < buffer_temp2) || (NULL == buffer_temp2)) && ((buffer_temp1 < buffer_temp3) || (NULL == buffer_temp3)))
{
// 如果最先出现"/*"
*buffer_temp1 = '\0'; // 截取有效字符串
fprintf(file_dst, (const int8_t*)"%s", (const int8_t*)buffer_beg); // 输出有效字符串
buffer_beg = buffer_temp1 + 2; // 找到新的起始点
mode = _MODE_NOTE_; // 进入注释模式
continue;
}
if ((NULL != buffer_temp2) && ((buffer_temp2 < buffer_temp1) || (NULL == buffer_temp1)) && ((buffer_temp2 < buffer_temp3) || (NULL == buffer_temp3)))
{
// 如果最先出现"\""
*buffer_temp2 = '\0'; // 截取有效字符串
fprintf(file_dst, (const int8_t*)"%s\"", (const int8_t*)buffer_beg); // 输出有效字符串
buffer_beg = buffer_temp2 + 1; // 找到新的起始点
mode = _MODE_STR_; // 进入字符串模式
continue;
}
if ((NULL != buffer_temp3) && ((buffer_temp3 < buffer_temp1) || (NULL == buffer_temp1)) && ((buffer_temp3 < buffer_temp2) || (NULL == buffer_temp2)))
{
// 如果最先出现"//"
*buffer_temp3 = '\0'; // 截取有效字符串
}
fprintf(file_dst, (const int8_t*)"%s", (const int8_t*)buffer_beg); // 输出有效字符串
}
if (feof(file_src) || (NULL == fgets((int8_t*)buffer, 512, file_src)))
{
fclose(file_src); // 关闭源文件
fclose(file_dst); // 关闭目标文件
return 0;
}
buffer_beg = (int8_t*)buffer;
}
return -1;
}
int main(int argc, char** argv)
{
if (_note_clr_((const int8_t*)"test.c", (const int8_t*)"test-dst.c"))
{
printf("error!");
return EXIT_FAILURE;
}
printf("ok!");
return EXIT_SUCCESS;
} 自己坐沙发 支持一下 {:victory:}{:victory:}{:victory:}{:victory:} 哈哈,测试成功,但输出格式较乱哦。。。。。。 好厉害的说 哇塞,这个可是好东西啊,楼主要是能做出一个exe文件直接发布就更爽了 谢谢楼主分享。。。。 先顶 删除C源代码里的注释 非常感谢!学习一下 zouzhichao 发表于 2014-1-4 17:45
自己坐沙发
有没有加注释的?例如函数说明,文件说明,添加固定的格式 这个可以有 格式 要不能变呀 呵呵 将删掉的 变空格吧不然 后面行的会上去 支持原创!{:victory:} 貌似很高端的样子哦 LZ辛苦了 $contents =~ s/((?<=\n)|^)[ \t]*\/\*.*?\*\/\n?|\/\*.*?\*\/|((?<=\n)|^)[ \t]*\/\/[^\n]*\n|\/\/[^\n]*//gs; rcdny123 发表于 2014-1-4 20:12
$contents =~ s/((?
能解决宏定义导致的注释吗 coding2011 发表于 2014-1-4 18:20
哈哈,测试成功,但输出格式较乱哦。。。。。。
刚出炉的,BUG是难免的 这篇帖子怎么回事很奇怪啊,用手机UC上网一进这篇帖子浏览器就自动退出了。{:mad:}{:dizzy:} enovo2468 发表于 2014-1-4 19:39
有没有加注释的?例如函数说明,文件说明,添加固定的格式
这个暂时还没考虑,不过以后会考虑试试 turf456 发表于 2014-1-4 21:10
这篇帖子怎么回事很奇怪啊,用手机UC上网一进这篇帖子浏览器就自动退出了。 ...
BUGBUGBUGBUG wuguoyan 发表于 2014-1-4 18:37
哇塞,这个可是好东西啊,楼主要是能做出一个exe文件直接发布就更爽了
额,我用的Ubuntu,没有windows了,要做成exe有点麻烦 很早以前已经用过哦。
coding2011 发表于 2014-1-4 18:20
哈哈,测试成功,但输出格式较乱哦。。。。。。
嗯,多谢反馈BUG richards 发表于 2014-1-4 20:07
貌似很高端的样子哦
很简陋的,暂时还不能保证处理后,还能正常通过编译 修改一个BUG:
当有“//”型注释的时候,格式会乱,下一行会窜上来
原因:
当检测到“//”时,之前的处理方式是将“//”所在的位置的内容置为'\0',因此最后少了一个换行符
解决办法:
将“//”所在的位置的内容置为“\r\n\0”
原部分代码:
if ((NULL != buffer_temp3) && ((buffer_temp3 < buffer_temp1) || (NULL == buffer_temp1)) && ((buffer_temp3 < buffer_temp2) || (NULL == buffer_temp2)))
{
// 如果最先出现"//"
*buffer_temp3 = '\0'; // 截取有效字符串
}
新代码:
if ((NULL != buffer_temp3) && ((buffer_temp3 < buffer_temp1) || (NULL == buffer_temp1)) && ((buffer_temp3 < buffer_temp2) || (NULL == buffer_temp2)))
{
// 如果最先出现"//"
*buffer_temp3++ = '\r'; // 截取有效字符串
*buffer_temp3++ = '\n'; // 截取有效字符串
*buffer_temp3 = '\0'; // 截取有效字符串
} 希望大家测试时发现的BUG都提交上来,以便修改改进之{:handshake:} aheadlead 发表于 2014-1-4 20:43
能解决宏定义导致的注释吗
宏定义导致的注释?什么样?举个例子
没必要搞得这么复杂吧,莫非楼主想锻炼下文件方面的操作?{:smile:}
如果有人喜欢printf("/*****内容****/"),那怎么办? haffman1 发表于 2014-1-4 22:45
没必要搞得这么复杂吧,莫非楼主想锻炼下文件方面的操作?
如果有人喜欢printf("/*****内容****/" ...
貌似你说的情况这个已经考虑了,不会误删
写这个虽然不成熟,也暂时看不到什么价值,但不是练手这么简单,自有用处 haffman1 发表于 2014-1-4 22:45
没必要搞得这么复杂吧,莫非楼主想锻炼下文件方面的操作?
如果有人喜欢printf("/*****内容****/" ...
比如说有人要源码,而你又不想给的太明白。。。。。。。 把自己的注释先删了吧{:titter:} 不错,代码保护 最好能把变量定义也改成无意义的,就跟牛气了 在 gitHub找到一个类似的 ,发给楼主参考参考
https://github.com/pebble8888/delcmt/blob/master/src/delcmt.cpp lzl000 发表于 2014-1-4 23:03
把自己的注释先删了吧
测试的时候就是用的代码本身{:lol:} ,哈哈,挥刀自宫,神功必成 jiaohaitao 发表于 2014-1-4 23:06
不错,代码保护
初衷是尝试编译前端分析,然后感觉难度太大,做不下去,就换了这个难度稍小的怪胎 tsb0574 发表于 2014-1-4 23:24
最好能把变量定义也改成无意义的,就跟牛气了
这个是下一步计划 y574924080 发表于 2014-1-4 23:40
在 gitHub找到一个类似的 ,发给楼主参考参考
https://github.com/pebble8888/delcmt/blob/master/src/del ...
多谢{:handshake:} 记号一个{:lol:}{:lol:}{:lol:}{:lol:} zouzhichao 发表于 2014-1-4 23:46
多谢
嘿嘿,不用谢,
现在发现github sourceforge 都是好东西
有什么想法可以去这些地方搜搜,看看别人做过没有
很不错的说 rcdny123 发表于 2014-1-4 22:36
宏定义导致的注释?什么样?举个例子
http://bbs.csdn.net/topics/80412856 rcdny123 发表于 2014-1-4 22:36
宏定义导致的注释?什么样?举个例子
我这么搞纯属作死= =
不要在意 处理后就很难读懂了。 witlong 发表于 2014-1-5 00:33
处理后就很难读懂了。
要的就是这效果 zouzhichao 发表于 2014-1-5 00:41
要的就是这效果
遇到不想给,但是要给的情形,这段程序希望能给你点安慰。{:handshake:} 楼主用LINUX啊,拿LEX做这个事情就几句话啊 stdio 发表于 2014-1-5 04:04
楼主用LINUX啊,拿LEX做这个事情就几句话啊
是的,正在学lex zouzhichao 发表于 2014-1-5 11:50
是的,正在学lex
要是能自动把变量全部换成a1,a2,a3,a4,a5,a6,不管是全局还是局部,无限排下去,那也叫一个强大啊! {:lol:}不错,继续努力 我只想说为什么不用python.......匿了 本帖最后由 JQ_Lin 于 2014-1-6 16:17 编辑
“刚写完还热乎着,......”。
也就是写了个自用的小程序,还不知道咋样,晒出来,让大家帮助找BUG。所以,也算不上什么开源。
用刚刚找到的一个删除代码注释小程序得到的实际效果截图(点击图片看清晰大图)
JQ_Lin 发表于 2014-1-6 16:10
“刚写完还热乎着,......”。
也就是写了个自用的小程序,还不知道咋样,晒出来,让大家帮助找BUG。所以, ...
标题就已说明了是小程序,难入你的法眼
只是不知道阁下心中的开源是如何?让在下见识见识? 太感谢了!前还没离职,项目一完就要给源码,不爽。给就算了,现在还派老板亲戚专门验证学习! zyw19987 发表于 2014-1-6 23:20
太感谢了!前还没离职,项目一完就要给源码,不爽。给就算了,现在还派老板亲戚专门验证学习! ...
代码尚未测试很久,建议你处理完后再编译一次,比较hex文件是否一致,以免出漏子 居然这么干 不让别人看懂你的代码吗? condor 发表于 2014-1-7 09:06
居然这么干 不让别人看懂你的代码吗?
人在江湖,身不由己
对不爽的人,给不爽的代码,无可非议吧?
你若觉得我这么做不齿的话,不妨看看楼主位的代码注释是否详细
这东西只是防小人,不防君子的
更何况这东西的初衷是做编译前端处理的,只是虎头蛇尾,成了这个玩意 再加把劲,争取扎成马尾 请问楼主 ,删除代码注释干什么啊?呵呵 不懂求教? zouzhichao 发表于 2014-1-7 22:06
人在江湖,身不由己
对不爽的人,给不爽的代码,无可非议吧?
你若觉得我这么做不齿的话,不妨看看楼主位 ...
不好意思呀 你误会我的意思了我没有说你不好的意思 tsb0574 发表于 2014-1-4 23:24
最好能把变量定义也改成无意义的,就跟牛气了
最好又能再变回来。哈哈 支持一下,也个EXE文件更直接点 好东西收藏 这种拿脚本语言写比较方便。
那个python正则匹配一下。 zouzhichao 发表于 2014-1-4 21:31
修改一个BUG:
当有“//”型注释的时候,格式会乱,下一行会窜上来
原因:
单纯替换到可能影响原来的格式
其实可以考虑:读原文件,边读边处理,再写入新文件,注释部分不保存到新文件。这样一致性会比较好。 condor 发表于 2014-1-8 08:12
不好意思呀 你误会我的意思了我没有说你不好的意思
不好意思,误会了 lyyyuna 发表于 2014-1-8 10:38
这种拿脚本语言写比较方便。
那个python正则匹配一下。
是的,python lex yacc这些做这个简单些,无奈刚开始不会lex这些,只好硬着头皮拿C写了一个简陋的 wns245249509 发表于 2014-1-7 23:11
请问楼主 ,删除代码注释干什么啊?呵呵 不懂求教?
1,做编译前端词法,语法分析,最好是删掉注释
2,遇到不爽的老板,给源代码也让他不爽一下 wns245249509 发表于 2014-1-7 23:11
请问楼主 ,删除代码注释干什么啊?呵呵 不懂求教?
BTW,不过其实很多人开发的时候,本来就不写注释,我也极少写注释,一般只有在交流的时候才加注释 zouzhichao 发表于 2014-1-7 22:06
人在江湖,身不由己
对不爽的人,给不爽的代码,无可非议吧?
你若觉得我这么做不齿的话,不妨看看楼主位 ...
对不爽的人,给不爽的代码{:lol:} 不错 顶起来!
支持原创 JQ_Lin 发表于 2014-1-6 16:10
“刚写完还热乎着,......”。
也就是写了个自用的小程序,还不知道咋样,晒出来,让大家帮助找BUG。所以, ...
ls用的什么文件比较软件呢
我用 WinMerge 2.14.0,但是不能显示行号,每次找不同的地方比较麻烦。我看你的这个有显示行号功能,比较效果如何呢? 我来传一个可以使用的exe文件
缺点:速度有点慢,一个23466行的c文件删除了10分钟都没弄完,最后给强制终止了。。可能是我的电脑慢了?
guxingganyue 发表于 2014-1-10 20:05
ls用的什么文件比较软件呢
我用 WinMerge 2.14.0,但是不能显示行号,每次找不同的地方比较麻烦。我看你 ...
哈哈,你看错了,没有行号的。
截图中的行号是 Total Commander 软件在比较两个文件时自动产生的行号。无用。
多谢楼主!! 本帖最后由 liufabing 于 2014-1-10 23:35 编辑
上传个网上下的,EXE文件.
用MSE扫过.
软件简介:
在我们写程序的时候为了区分程序或者模块,都会使用注释,假如源代码过多,注释又太多,最后你想清理一下注释内容的时候,这时候你会发现是个庞大的工程,不过现在有了“C类语言源代码注释去除程序”,让您这一工作变的很轻松就可以完成!只要选择好源程序文件点“开始处理”按钮进行处理即可!
提示:C类语言源代码注释去除程序支持文件格式有:c、c++、h、hpp、java
-----------------------------------------------------------------------------------------------------------
修改:
没注意76楼已经有了,删除附件. mark 删注释。76l 有EXE程序 其实这个帖子中的4个软件有2个是非常的好用,快速。大家可以试试
http://www.amobbs.com/thread-4691467-1-1.html guxingganyue 发表于 2014-1-11 14:40
其实这个帖子中的4个软件有2个是非常的好用,快速。大家可以试试
{:handshake:} 貌似给你写过代码 zouzhichao 发表于 2014-1-13 14:25
貌似给你写过代码
嗯,对,把一个文件夹下N个txt文件中的16进制转成10进制保存
再次感谢一下 guxingganyue 发表于 2014-1-13 19:36
嗯,对,把一个文件夹下N个txt文件中的16进制转成10进制保存
再次感谢一下 ...
看你的ID好眼熟 mark 删注释。 收藏下 zouzhichao 发表于 2014-1-5 11:50
是的,正在学lex
这个怎么使用呀 GZLJZ 发表于 2017-1-10 14:06
这个怎么使用呀
刚学了点皮毛,要不贴个flex版本的? 本帖最后由 GZLJZ 于 2017-1-10 15:38 编辑
zouzhichao 发表于 2017-1-10 14:23
刚学了点皮毛,要不贴个flex版本的?
怎么删除C文件的注析呀。哦,看到了76l 有EXE程序,确定好用 学习了,谢谢
页:
[1]