免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8480 | 回复: 52
打印 上一主题 下一主题

请教去除c代码中的注释的方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-24 19:49 |只看该作者 |倒序浏览
突然觉得这个问题挺好玩的,想知道究竟有多少种方法可以去掉c代码中的注释,然后再比较各种方法之间的优劣如何。大家不妨当个游戏,望各位shell高手不吝赐教!

http://bbs.chinaunix.net/viewthr ... &extra=page%3D1

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2006-10-24 20:31 |只看该作者
awk 'BEGIN{RS="/\*|\*/"} NR/2'  urfile
没测试

论坛徽章:
0
3 [报告]
发表于 2006-10-24 20:37 |只看该作者

  1. perl -ne 'if(/\/\*/&&/\*\//||/^$/){next}elsif(/\/\*/){$flag=1;next}elsif(/\*\//){$flag=0;next}else{if($flag){next}else{print}}'
  2. sed 's/\/\*.*\*\///;/\/\*/,/\*\//d;/^[\ ]*$/d'
复制代码

论坛徽章:
0
4 [报告]
发表于 2006-10-24 20:49 |只看该作者
原帖由 waker 于 2006-10-24 20:31 发表
awk 'BEGIN{RS="/\*|\*/"} NR/2'  urfile
没测试


多谢出手,^_^,不过好像测试没通过。。。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
5 [报告]
发表于 2006-10-24 20:53 |只看该作者
NR%2

写错了

论坛徽章:
0
6 [报告]
发表于 2006-10-24 20:57 |只看该作者
原帖由 lovesaka 于 2006-10-24 20:37 发表

  1. perl -ne 'if(/\/\*/&&/\*\//||/^$/){next}elsif(/\/\*/){$flag=1;next}elsif(/\*\//){$flag=0;next}else{if($flag){next}else{print}}'
  2. sed 's/\/\*.*\*\///;/\/\*/,/\*\//d;/^[\ ]*$/d'
复制代码


多谢出手!^_^

不过似乎光是perl那一步就已经完成任务了,sed没有对结果产生影响。
另外,这个方法目前还无法处理下面这种情况:
  1. int  foo; /* xxxxxxxxxxxxxxxx
  2.                  xxxxxxxxxxxxxx  */
复制代码

论坛徽章:
0
7 [报告]
发表于 2006-10-24 21:00 |只看该作者
原帖由 waker 于 2006-10-24 20:53 发表
NR%2

写错了



老大果然强悍!除了空行还留着之外其它功能都已经实现了。原来看你写的脚本就常常有神来之笔,这次又见识了!跟你的这几个字符比起来,俺捧着手册写的那个awk脚本就贻笑大方了,呵呵!^_^

多谢!

论坛徽章:
0
8 [报告]
发表于 2006-10-24 21:54 |只看该作者
写了一下,还是有问题。
  1. sed '
  2.                 s%//.*%%

  3.         /\/\*/{
  4.         :next
  5.                 /\*\//!{
  6.                         N
  7.                         t next
  8.                 }
  9.                 s%/\*.*\*\/%%
  10.         }
  11. '
复制代码

论坛徽章:
0
9 [报告]
发表于 2006-10-24 21:57 |只看该作者
呵呵,这情况就难办了:
int a =1; /*bbbbb/*cccccc/*deeeee*/
//aaa/*bbbbb/*cccccc/*deeeee*/

论坛徽章:
0
10 [报告]
发表于 2006-10-24 22:03 |只看该作者
我的思路基本是:
1、除出 // comment
2、对于 /* comment */,由于可能跨行,sed不大好处理。
    a. 将 /* 替换成 \n^/*,*/ 替换成 */\n,然后把 /* 和 */ 中间的行删除
    b. 在 /* 开始,到 */ 之前那些行通过 N读入,然后一次过删除。
    c. /* 行从 /*删除,在遇到 */之前的行删除,*/行 删除 */之前内容。

btw: 手生,实践起来不容易
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP