zouzhichao 发表于 2014-1-4 17:42:53

开源一个小程序,删除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;
}

zouzhichao 发表于 2014-1-4 17:45:58

自己坐沙发

szpspike 发表于 2014-1-4 17:58:51

支持一下

shanyan 发表于 2014-1-4 18:18:49

{:victory:}{:victory:}{:victory:}{:victory:}

coding2011 发表于 2014-1-4 18:20:34

哈哈,测试成功,但输出格式较乱哦。。。。。。

四轴飞行器 发表于 2014-1-4 18:34:12

好厉害的说

wuguoyan 发表于 2014-1-4 18:37:42

哇塞,这个可是好东西啊,楼主要是能做出一个exe文件直接发布就更爽了

lans0625 发表于 2014-1-4 18:56:01

谢谢楼主分享。。。。

Zigbee2012 发表于 2014-1-4 18:56:26

先顶 删除C源代码里的注释

binaimei2007 发表于 2014-1-4 19:00:59

非常感谢!学习一下

enovo2468 发表于 2014-1-4 19:39:02

zouzhichao 发表于 2014-1-4 17:45
自己坐沙发

有没有加注释的?例如函数说明,文件说明,添加固定的格式

wind2100 发表于 2014-1-4 19:54:04

这个可以有 格式 要不能变呀 呵呵

wind2100 发表于 2014-1-4 19:54:27

将删掉的 变空格吧不然 后面行的会上去

byrin219 发表于 2014-1-4 20:06:59

支持原创!{:victory:}

richards 发表于 2014-1-4 20:07:52

貌似很高端的样子哦

kxb 发表于 2014-1-4 20:08:08

LZ辛苦了

rcdny123 发表于 2014-1-4 20:12:45

$contents =~ s/((?<=\n)|^)[ \t]*\/\*.*?\*\/\n?|\/\*.*?\*\/|((?<=\n)|^)[ \t]*\/\/[^\n]*\n|\/\/[^\n]*//gs;

aheadlead 发表于 2014-1-4 20:43:45

rcdny123 发表于 2014-1-4 20:12
$contents =~ s/((?

能解决宏定义导致的注释吗

zouzhichao 发表于 2014-1-4 21:10:16

coding2011 发表于 2014-1-4 18:20
哈哈,测试成功,但输出格式较乱哦。。。。。。

刚出炉的,BUG是难免的

turf456 发表于 2014-1-4 21:10:25

这篇帖子怎么回事很奇怪啊,用手机UC上网一进这篇帖子浏览器就自动退出了。{:mad:}{:dizzy:}

zouzhichao 发表于 2014-1-4 21:11:15

enovo2468 发表于 2014-1-4 19:39
有没有加注释的?例如函数说明,文件说明,添加固定的格式

这个暂时还没考虑,不过以后会考虑试试

zouzhichao 发表于 2014-1-4 21:11:42

turf456 发表于 2014-1-4 21:10
这篇帖子怎么回事很奇怪啊,用手机UC上网一进这篇帖子浏览器就自动退出了。 ...

BUGBUGBUGBUG

zouzhichao 发表于 2014-1-4 21:12:58

wuguoyan 发表于 2014-1-4 18:37
哇塞,这个可是好东西啊,楼主要是能做出一个exe文件直接发布就更爽了

额,我用的Ubuntu,没有windows了,要做成exe有点麻烦

JQ_Lin 发表于 2014-1-4 21:13:54

很早以前已经用过哦。

zouzhichao 发表于 2014-1-4 21:14:24

coding2011 发表于 2014-1-4 18:20
哈哈,测试成功,但输出格式较乱哦。。。。。。

嗯,多谢反馈BUG

zouzhichao 发表于 2014-1-4 21:15:36

richards 发表于 2014-1-4 20:07
貌似很高端的样子哦

很简陋的,暂时还不能保证处理后,还能正常通过编译

zouzhichao 发表于 2014-1-4 21:31:32

修改一个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'; // 截取有效字符串
                        }

zouzhichao 发表于 2014-1-4 21:33:23

希望大家测试时发现的BUG都提交上来,以便修改改进之{:handshake:}

rcdny123 发表于 2014-1-4 22:36:56

aheadlead 发表于 2014-1-4 20:43
能解决宏定义导致的注释吗

宏定义导致的注释?什么样?举个例子

haffman1 发表于 2014-1-4 22:45:34

没必要搞得这么复杂吧,莫非楼主想锻炼下文件方面的操作?{:smile:}
如果有人喜欢printf("/*****内容****/"),那怎么办?

zouzhichao 发表于 2014-1-4 22:51:54

haffman1 发表于 2014-1-4 22:45
没必要搞得这么复杂吧,莫非楼主想锻炼下文件方面的操作?
如果有人喜欢printf("/*****内容****/" ...

貌似你说的情况这个已经考虑了,不会误删
写这个虽然不成熟,也暂时看不到什么价值,但不是练手这么简单,自有用处

zouzhichao 发表于 2014-1-4 22:54:51

haffman1 发表于 2014-1-4 22:45
没必要搞得这么复杂吧,莫非楼主想锻炼下文件方面的操作?
如果有人喜欢printf("/*****内容****/" ...

比如说有人要源码,而你又不想给的太明白。。。。。。。

lzl000 发表于 2014-1-4 23:03:33

把自己的注释先删了吧{:titter:}

jiaohaitao 发表于 2014-1-4 23:06:01

不错,代码保护

tsb0574 发表于 2014-1-4 23:24:36

最好能把变量定义也改成无意义的,就跟牛气了

y574924080 发表于 2014-1-4 23:40:06

在 gitHub找到一个类似的 ,发给楼主参考参考

https://github.com/pebble8888/delcmt/blob/master/src/delcmt.cpp

zouzhichao 发表于 2014-1-4 23:42:25

lzl000 发表于 2014-1-4 23:03
把自己的注释先删了吧

测试的时候就是用的代码本身{:lol:} ,哈哈,挥刀自宫,神功必成

zouzhichao 发表于 2014-1-4 23:44:09

jiaohaitao 发表于 2014-1-4 23:06
不错,代码保护

初衷是尝试编译前端分析,然后感觉难度太大,做不下去,就换了这个难度稍小的怪胎

zouzhichao 发表于 2014-1-4 23:44:41

tsb0574 发表于 2014-1-4 23:24
最好能把变量定义也改成无意义的,就跟牛气了

这个是下一步计划

zouzhichao 发表于 2014-1-4 23:46:12

y574924080 发表于 2014-1-4 23:40
在 gitHub找到一个类似的 ,发给楼主参考参考

https://github.com/pebble8888/delcmt/blob/master/src/del ...

多谢{:handshake:}

chengpiaopiao 发表于 2014-1-4 23:51:49

记号一个{:lol:}{:lol:}{:lol:}{:lol:}

y574924080 发表于 2014-1-4 23:56:19

zouzhichao 发表于 2014-1-4 23:46
多谢

嘿嘿,不用谢,

现在发现github sourceforge 都是好东西

有什么想法可以去这些地方搜搜,看看别人做过没有

fskjhm 发表于 2014-1-5 00:06:54

很不错的说

aheadlead 发表于 2014-1-5 00:16:34

rcdny123 发表于 2014-1-4 22:36
宏定义导致的注释?什么样?举个例子

http://bbs.csdn.net/topics/80412856

aheadlead 发表于 2014-1-5 00:17:08

rcdny123 发表于 2014-1-4 22:36
宏定义导致的注释?什么样?举个例子

我这么搞纯属作死= =
不要在意

witlong 发表于 2014-1-5 00:33:06

处理后就很难读懂了。

zouzhichao 发表于 2014-1-5 00:41:20

witlong 发表于 2014-1-5 00:33
处理后就很难读懂了。

要的就是这效果

witlong 发表于 2014-1-5 00:58:52

zouzhichao 发表于 2014-1-5 00:41
要的就是这效果

遇到不想给,但是要给的情形,这段程序希望能给你点安慰。{:handshake:}

stdio 发表于 2014-1-5 04:04:12

楼主用LINUX啊,拿LEX做这个事情就几句话啊

zouzhichao 发表于 2014-1-5 11:50:48

stdio 发表于 2014-1-5 04:04
楼主用LINUX啊,拿LEX做这个事情就几句话啊

是的,正在学lex

kinsno 发表于 2014-1-5 12:21:34

zouzhichao 发表于 2014-1-5 11:50
是的,正在学lex

要是能自动把变量全部换成a1,a2,a3,a4,a5,a6,不管是全局还是局部,无限排下去,那也叫一个强大啊!

rifjft 发表于 2014-1-5 14:45:45

{:lol:}不错,继续努力

shamiao 发表于 2014-1-5 15:08:40

我只想说为什么不用python.......匿了

JQ_Lin 发表于 2014-1-6 16:10:37

本帖最后由 JQ_Lin 于 2014-1-6 16:17 编辑

“刚写完还热乎着,......”。
也就是写了个自用的小程序,还不知道咋样,晒出来,让大家帮助找BUG。所以,也算不上什么开源。

用刚刚找到的一个删除代码注释小程序得到的实际效果截图(点击图片看清晰大图)



zouzhichao 发表于 2014-1-6 17:47:23

JQ_Lin 发表于 2014-1-6 16:10
“刚写完还热乎着,......”。
也就是写了个自用的小程序,还不知道咋样,晒出来,让大家帮助找BUG。所以, ...

标题就已说明了是小程序,难入你的法眼
只是不知道阁下心中的开源是如何?让在下见识见识?

zyw19987 发表于 2014-1-6 23:20:39

太感谢了!前还没离职,项目一完就要给源码,不爽。给就算了,现在还派老板亲戚专门验证学习!

zouzhichao 发表于 2014-1-6 23:32:37

zyw19987 发表于 2014-1-6 23:20
太感谢了!前还没离职,项目一完就要给源码,不爽。给就算了,现在还派老板亲戚专门验证学习! ...

代码尚未测试很久,建议你处理完后再编译一次,比较hex文件是否一致,以免出漏子

condor 发表于 2014-1-7 09:06:44

居然这么干    不让别人看懂你的代码吗?

zouzhichao 发表于 2014-1-7 22:06:46

condor 发表于 2014-1-7 09:06
居然这么干    不让别人看懂你的代码吗?

人在江湖,身不由己
对不爽的人,给不爽的代码,无可非议吧?
你若觉得我这么做不齿的话,不妨看看楼主位的代码注释是否详细
这东西只是防小人,不防君子的
更何况这东西的初衷是做编译前端处理的,只是虎头蛇尾,成了这个玩意

rifjft 发表于 2014-1-7 22:58:22

再加把劲,争取扎成马尾

wns245249509 发表于 2014-1-7 23:11:08

请问楼主 ,删除代码注释干什么啊?呵呵 不懂求教?

condor 发表于 2014-1-8 08:12:26

zouzhichao 发表于 2014-1-7 22:06
人在江湖,身不由己
对不爽的人,给不爽的代码,无可非议吧?
你若觉得我这么做不齿的话,不妨看看楼主位 ...

不好意思呀 你误会我的意思了我没有说你不好的意思

ssclark1988 发表于 2014-1-8 09:21:49

tsb0574 发表于 2014-1-4 23:24
最好能把变量定义也改成无意义的,就跟牛气了

最好又能再变回来。哈哈

Let 发表于 2014-1-8 10:26:59

支持一下,也个EXE文件更直接点

justdomyself 发表于 2014-1-8 10:35:36

好东西收藏

lyyyuna 发表于 2014-1-8 10:38:39

这种拿脚本语言写比较方便。

那个python正则匹配一下。

xiangxiadage 发表于 2014-1-8 11:17:34

zouzhichao 发表于 2014-1-4 21:31
修改一个BUG:
当有“//”型注释的时候,格式会乱,下一行会窜上来
原因:


单纯替换到可能影响原来的格式
其实可以考虑:读原文件,边读边处理,再写入新文件,注释部分不保存到新文件。这样一致性会比较好。

zouzhichao 发表于 2014-1-8 12:42:01

condor 发表于 2014-1-8 08:12
不好意思呀 你误会我的意思了我没有说你不好的意思

不好意思,误会了

zouzhichao 发表于 2014-1-8 12:44:53

lyyyuna 发表于 2014-1-8 10:38
这种拿脚本语言写比较方便。

那个python正则匹配一下。

是的,python lex yacc这些做这个简单些,无奈刚开始不会lex这些,只好硬着头皮拿C写了一个简陋的

zouzhichao 发表于 2014-1-8 12:46:47

wns245249509 发表于 2014-1-7 23:11
请问楼主 ,删除代码注释干什么啊?呵呵 不懂求教?

1,做编译前端词法,语法分析,最好是删掉注释
2,遇到不爽的老板,给源代码也让他不爽一下

zouzhichao 发表于 2014-1-8 12:54:05

wns245249509 发表于 2014-1-7 23:11
请问楼主 ,删除代码注释干什么啊?呵呵 不懂求教?

BTW,不过其实很多人开发的时候,本来就不写注释,我也极少写注释,一般只有在交流的时候才加注释

cmheia 发表于 2014-1-8 13:06:05

zouzhichao 发表于 2014-1-7 22:06
人在江湖,身不由己
对不爽的人,给不爽的代码,无可非议吧?
你若觉得我这么做不齿的话,不妨看看楼主位 ...

对不爽的人,给不爽的代码{:lol:}

mcuprogram 发表于 2014-1-8 22:28:06

不错      

Hopven 发表于 2014-1-9 16:25:03

顶起来!
支持原创

guxingganyue 发表于 2014-1-10 20:05:59

JQ_Lin 发表于 2014-1-6 16:10
“刚写完还热乎着,......”。
也就是写了个自用的小程序,还不知道咋样,晒出来,让大家帮助找BUG。所以, ...

ls用的什么文件比较软件呢

我用 WinMerge 2.14.0,但是不能显示行号,每次找不同的地方比较麻烦。我看你的这个有显示行号功能,比较效果如何呢?

guxingganyue 发表于 2014-1-10 20:10:55

我来传一个可以使用的exe文件


缺点:速度有点慢,一个23466行的c文件删除了10分钟都没弄完,最后给强制终止了。。可能是我的电脑慢了?

JQ_Lin 发表于 2014-1-10 20:18:16

guxingganyue 发表于 2014-1-10 20:05
ls用的什么文件比较软件呢

我用 WinMerge 2.14.0,但是不能显示行号,每次找不同的地方比较麻烦。我看你 ...

哈哈,你看错了,没有行号的。
截图中的行号是 Total Commander 软件在比较两个文件时自动产生的行号。无用。

g527727372 发表于 2014-1-10 22:41:20

多谢楼主!!

liufabing 发表于 2014-1-10 23:33:57

本帖最后由 liufabing 于 2014-1-10 23:35 编辑

上传个网上下的,EXE文件.
用MSE扫过.
软件简介:

在我们写程序的时候为了区分程序或者模块,都会使用注释,假如源代码过多,注释又太多,最后你想清理一下注释内容的时候,这时候你会发现是个庞大的工程,不过现在有了“C类语言源代码注释去除程序”,让您这一工作变的很轻松就可以完成!只要选择好源程序文件点“开始处理”按钮进行处理即可!

提示:C类语言源代码注释去除程序支持文件格式有:c、c++、h、hpp、java

-----------------------------------------------------------------------------------------------------------
修改:
没注意76楼已经有了,删除附件.

liuzhen526 发表于 2014-1-11 11:23:05

mark 删注释。76l 有EXE程序

guxingganyue 发表于 2014-1-11 14:40:18

其实这个帖子中的4个软件有2个是非常的好用,快速。大家可以试试


http://www.amobbs.com/thread-4691467-1-1.html

zouzhichao 发表于 2014-1-13 14:25:15

guxingganyue 发表于 2014-1-11 14:40
其实这个帖子中的4个软件有2个是非常的好用,快速。大家可以试试




{:handshake:} 貌似给你写过代码

guxingganyue 发表于 2014-1-13 19:36:56

zouzhichao 发表于 2014-1-13 14:25
貌似给你写过代码

嗯,对,把一个文件夹下N个txt文件中的16进制转成10进制保存

再次感谢一下

zouzhichao 发表于 2014-1-13 19:50:14

guxingganyue 发表于 2014-1-13 19:36
嗯,对,把一个文件夹下N个txt文件中的16进制转成10进制保存

再次感谢一下 ...

看你的ID好眼熟

eit 发表于 2014-1-13 20:09:51

mark 删注释。

Xiyuhexuan 发表于 2017-1-3 15:37:45

收藏下      

GZLJZ 发表于 2017-1-10 14:06:37

zouzhichao 发表于 2014-1-5 11:50
是的,正在学lex

这个怎么使用呀

zouzhichao 发表于 2017-1-10 14:23:23

GZLJZ 发表于 2017-1-10 14:06
这个怎么使用呀

刚学了点皮毛,要不贴个flex版本的?

GZLJZ 发表于 2017-1-10 15:27:40

本帖最后由 GZLJZ 于 2017-1-10 15:38 编辑

zouzhichao 发表于 2017-1-10 14:23
刚学了点皮毛,要不贴个flex版本的?

怎么删除C文件的注析呀。哦,看到了76l 有EXE程序,确定好用

sml009 发表于 2017-2-7 19:22:55

学习了,谢谢                        
页: [1]
查看完整版本: 开源一个小程序,删除C源代码里的注释!