请你编写一个函数,将C语言源程序中的注释全部删去。 函数原型 // 删除注释 void Pack(FILE *src, FILE *dst); 说明:参数 src 和 dst 均为文件指针,其中:src 指示原始程序文件,dst 指示整理后得到的文件。 C语言规定:注释以 /* 开始,以 */ 结束。注释可以跨行,不允许嵌套。字符串中的 /* 和 */ 不是注释。 此外C语言还规定:注释相当于一个空白字符。因此,注释被删除后应补入一个空格。
时间: 2024-03-18 13:39:44 浏览: 15
以下是实现该函数的代码:
```c
void Pack(FILE *src, FILE *dst) {
int c1, c2;
int in_comment = 0;
while ((c1 = fgetc(src)) != EOF) {
if (in_comment) {
if (c1 == '*' && (c2 = fgetc(src)) == '/') {
in_comment = 0;
fputc(' ', dst);
}
} else {
if (c1 == '/' && (c2 = fgetc(src)) == '*') {
in_comment = 1;
} else if (c1 == '"' || c1 == '\'') {
fputc(c1, dst);
while ((c1 = fgetc(src)) != EOF) {
fputc(c1, dst);
if (c1 == c2) {
break;
}
if (c1 == '\\') {
fputc(fgetc(src), dst);
}
}
} else {
fputc(c1, dst);
}
}
}
}
```
函数中使用了两个变量:in_comment 表示当前是否在注释中,c1 和 c2 表示当前读取的两个字符。首先读取一个字符 c1,如果当前不在注释中,则判断是否是注释的开始,如果是则将 in_comment 置为 1;如果当前在注释中,则判断是否是注释的结束,如果是则将 in_comment 置为 0,并在输出文件中插入一个空格。如果当前读取的字符既不是注释的开始也不是注释的结束,则判断是否是字符串中的引号,如果是则将整个字符串输出到文件中。如果当前字符既不是注释的开始也不是注释的结束,也不是字符串中的引号,则将该字符输出到文件中。函数中使用了标准库函数 fgetc() 和 fputc(),分别用于读取和写入文件中的一个字符。