实现去除c语言注释的小工具

时间:2021-05-19

去除C代码中的注释,
1. 单行注释//;
2. 多行注释;
3. 单行注释以“\”结尾则下一行也为注释;
4. 字符串中的注释不处理。
说是C语言,但其实所有C语系的都可以,比如Java。


小工具:去除C语言注释
复制代码 代码如下:
#include <stdio.h>

int main(int argc, char* argv[]) {
enum {
literal,
single,
multiple,
string
} mode = literal;
char last = 0, current;

while ((current = getchar()) != EOF) {
switch (mode) {
case single: {
if (last != '\\' && (current == '\n' || current == '\r')) {
putchar(current);
current = 0;
mode = literal;
}
} break;
case multiple: {
if (last == '*' && current == '/') {
current = 0;
mode = literal;
}
} break;
case string: {
if (last == '\\') {
putchar(last);
putchar(current);
} else if (current != '\\') {
putchar(current);
if (current == '"') {
mode = literal;
}
}
} break;
default: {
if (last == '/') {
if (current == '/') {
mode = single;
} else if (current == '*') {
mode = multiple;
} else {
putchar(last);
putchar(current);
}
} else if (current != '/') {
putchar(current);
if (current == '"') {
mode = string;
}
}
} break;
}
last = current;
}

return 0;
}

测试代码

复制代码 代码如下:
#include <stdlib.h>
#include <stdio.h>

int main (int argc, char *argv[])
{
// not show\
not show\
not show
// not show

int is; // not show
int ms;
double ds; // not show\
not show\
not show
double dm; float fs; /**
* now show
*/
float fm;
char cs[] = "aaa // /***/";
char cm1[] = "hello*/";
char cm2[] = "/*redraiment";

return EXIT_SUCCESS;
}

处理后的代码

复制代码 代码如下:
#include <stdlib.h>
#include <stdio.h>

int main (int argc, char *argv[])
{

int is;
int ms;
double ds;
double dm; float fs;
float fm;
char cs[] = "aaa // /***/";
char cm1[] = "hello*/";
char cm2[] = "/*redraiment";

return EXIT_SUCCESS;
}

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章