去除C语言注释

问题

想去除C语言里面的所有注释,包括 /**/ 和 // ,网上找的方法一般是正则表达式或者自己写字符串匹配去除,但是那些只能应对简单的情况,对于工程里面很多复杂的C代码,例如遇到printf("/* hello world */")等这种特殊情况往往会出错,所以需要采用一种绝对不会出错的方法

解决方法

我们采用gcc的预处理,编译C代码的第一步是预处理,一般默认是删除注释,宏展开以及把头文件的内容放在代码里。

常用命令是

gcc -E test.c -o test.i

现在我们的目标是只去除注释,采用命令

gcc -fpreprocessed -dD -E test.c

这个命令执行完会把去除注释后的代码输出到屏幕上,可以采用重定向的方式写到文件里

需要注意的是去除注释后的内容有一点瑕疵,里面会多出来一些类似于

# 数字 "test.c"

所以第二步就是把这些多出来的字符串去掉

这些字符串的特征就是# 开头,第二列是数字,第三列是引号包括的文件名,删除掉就得到了纯代码文本

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的去除多行注释的示例代码(使用C语言编写): ```c #include <stdio.h> void remove_comments(FILE* input_file, FILE* output_file) { int c, prev_c; int in_comment = 0; while ((c = fgetc(input_file)) != EOF) { if (in_comment) { // 如果当前在注释中,则判断是否遇到了注释结束符号 if (prev_c == '*' && c == '/') { in_comment = 0; } } else { // 如果当前不在注释中,则判断是否遇到了注释开始符号 if (prev_c == '/' && c == '*') { in_comment = 1; } else { // 如果当前不在注释中且不是注释符号,则写入输出文件 fputc(prev_c, output_file); } } prev_c = c; } // 写入最后一个字符 fputc(prev_c, output_file); } int main(int argc, char* argv[]) { if (argc != 3) { printf("Usage: %s input_file output_file\n", argv[0]); return 1; } FILE* input_file = fopen(argv[1], "r"); if (input_file == NULL) { printf("Cannot open input file %s\n", argv[1]); return 1; } FILE* output_file = fopen(argv[2], "w"); if (output_file == NULL) { fclose(input_file); printf("Cannot open output file %s\n", argv[2]); return 1; } remove_comments(input_file, output_file); fclose(input_file); fclose(output_file); return 0; } ``` 以上代码使用了一个 `in_comment` 变量来表示当前是否在多行注释中,同时使用 `prev_c` 变量来记录上一个字符。在遍历输入文件时,如果当前在注释中,则判断是否遇到了注释结束符号;如果当前不在注释中,则判断是否遇到了注释开始符号。如果当前不在注释中且不是注释符号,则将上一个字符写入输出文件。 你可以根据需要对代码进行修改和优化,例如增加错误处理、优化读写文件的方式等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值