描述 C程序的注释用/*...*/来表示。请写一个程序,将输入的C程序源代码中的注释去掉,输出去掉注释之后的源代码。 用于测试的C代码保证符合语法,不使用C++的//注释语法。 注意,C语言不允许出现嵌套注释。具体来说,对于/*/**/"*/",如果不允许嵌套注释,那么它表示字符串"*/";如果允许嵌套注释,它表示一个引号"。 还请注意,字符串中出现的注释符/*属于字符串的一部分,注释中出现的双引号"属于注释的一部分。 输入 符合语法的C代码文本文件。代码每行不超过200个字符。 输出 去掉注释后的C代码。要求只能去掉注释,不可以做其他的修改,比如调整缩进,去除注释之外的换行符等。 提示 注意字符串,字符,转义字符的情况。 看看自己有没有考虑 "a\"/*ccc*/" 这种情况。
时间: 2024-03-18 11:40:45 浏览: 108
C程序去除注释工具,可去除C语言源代码中的注释
3星 · 编辑精心推荐
以下是一个可能的解法,使用状态机来处理不同的注释和字符串状态:
```c
#include <stdio.h>
enum State {
NORMAL,
IN_STRING,
IN_COMMENT,
IN_COMMENT_STAR
};
int main() {
enum State state = NORMAL;
char c, prev_c = '\0';
while ((c = getchar()) != EOF) {
switch (state) {
case NORMAL:
if (c == '"') {
state = IN_STRING;
} else if (c == '/' && prev_c == '/') {
// 单行注释
putchar(prev_c);
state = IN_COMMENT;
} else if (c == '/' && prev_c == '*') {
// 结束多行注释
state = NORMAL;
} else if (c == '*') {
state = IN_COMMENT_STAR; // 可能开始多行注释
} else {
putchar(c);
}
break;
case IN_STRING:
putchar(c); // 字符串中的所有内容都不处理
if (c == '"' && prev_c != '\\') {
state = NORMAL;
}
break;
case IN_COMMENT:
if (c == '\n') {
putchar(c);
state = NORMAL;
}
break;
case IN_COMMENT_STAR:
if (c == '/') {
// 结束多行注释
state = NORMAL;
} else if (c == '*') {
// 继续多行注释
state = IN_COMMENT_STAR;
} else {
// 恢复正常状态
state = NORMAL;
putchar(prev_c);
putchar(c);
}
break;
}
prev_c = c;
}
return 0;
}
```
这个程序使用了一个 `enum` 类型来表示不同的状态,并使用 `switch` 语句来根据状态进行处理。在每个状态中,程序根据当前字符和前一个字符的情况来判断是否需要转换状态或输出字符。需要注意的是,对于多行注释中出现的 `*/`,可能需要特殊处理。
阅读全文