C语言去除注释
Removing comments in C language
我需要编写一个可以从文件中删除评论的程序。删除标准注释非常简单。但是,我还没有想出一种方法来删除“带连字符的”评论。例如,前两行代码是注释。我的程序不理解这一点,只删除了注释的第一行。
// Function for output to console\
ns2
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <iso646.h>
int main() {
FILE *in = fopen("inp.c", "r");
FILE *out = fopen("out.c", "w");
char ch;
while ((ch = fgetc(in)) not_eq EOF) {
if (ch == '/') {
int flag_1 = 0;
ch = fgetc(in);
if (ch == '/') {
flag_1 = 1;
while ((ch = fgetc(in)) not_eq '\n') {
ch = fgetc(in);
if (ch == '\') {
ch = '\n';
break;
}
}
ch = '\n';
}
else if (ch == '*') {
flag_1 = 1;
while ((ch = fgetc(in)) not_eq EOF) {
if ((ch = fgetc(in)) == '*' and (ch = fgetc(in)) == '/') {
ch = '\n';
break;
}
}
}
if (flag_1 == 0)
fputc('/', out);
}
if (ch == '"') {
fputc(ch, out);
while ((ch = fgetc(in)) not_eq '"') {
fputc(ch, out);
}
}
fputc(ch, out);
}
fclose(in);
fclose(out);
return 0;
}
一个多小时以来,我一直在尝试补充/更改程序,但初学者的知识不允许我掌握这项任务。我很乐意听取您的建议!
为了忽略转义的换行符,即 \
后跟换行符的序列,您可以使用透明处理此问题的函数。
还要注意这些问题:
ch
必须定义为 int
才能正确处理 EOF
。
<iso646.h>
中定义的宏使代码的可读性降低。
\
应该在解析字符串的时候处理
- 字符常量也应该被解析:
'//'
是一个有效的字符常量,不是注释。
// Function for output to console\
ns2
/\
*\ This is a valid comment too :)
*\
/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int mygetc(FILE *in) {
for (;;) {
int c = getc(in);
if (c == '\') {
c = getc(in);
if (c == '\n')
continue;
if (c != EOF)
ungetc(c, in);
c = '\';
}
return c;
}
}
int skip_line_comment(FILE *in) {
int c;
while ((c = mygetc(in)) != '\n' && c != EOF)
continue;
return c;
}
int skip_block_comment(FILE *in) {
int c;
for (;;) {
while ((c = mygetc(in)) != '*') {
if (c == EOF)
return c;
}
while ((c = mygetc(in)) == '*')
continue;
if (c == EOF)
return c;
if (c == '/')
return ' ';
}
}
int main() {
FILE *in = fopen("inp.c", "r");
FILE *out = fopen("out.c", "w");
int ch;
while ((ch = mygetc(in)) != EOF) {
if (ch == '/') {
ch = skip_line_comment(in);
} else
if (ch == '*') {
ch = skip_block_comment(in);
} else
if (ch == '"' || ch == '\'') {
int sep = ch;
fputc(ch, out);
while ((ch = mygetc(in)) != sep && ch != EOF) {
fputc(ch, out);
if (ch == '\') {
ch = mygetc(in);
if (ch == EOF)
break;
fputc(ch, out);
}
}
}
if (ch == EOF)
break;
fputc(ch, out);
}
fclose(in);
fclose(out);
return 0;
}
我需要编写一个可以从文件中删除评论的程序。删除标准注释非常简单。但是,我还没有想出一种方法来删除“带连字符的”评论。例如,前两行代码是注释。我的程序不理解这一点,只删除了注释的第一行。
// Function for output to console\
ns2
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <iso646.h>
int main() {
FILE *in = fopen("inp.c", "r");
FILE *out = fopen("out.c", "w");
char ch;
while ((ch = fgetc(in)) not_eq EOF) {
if (ch == '/') {
int flag_1 = 0;
ch = fgetc(in);
if (ch == '/') {
flag_1 = 1;
while ((ch = fgetc(in)) not_eq '\n') {
ch = fgetc(in);
if (ch == '\') {
ch = '\n';
break;
}
}
ch = '\n';
}
else if (ch == '*') {
flag_1 = 1;
while ((ch = fgetc(in)) not_eq EOF) {
if ((ch = fgetc(in)) == '*' and (ch = fgetc(in)) == '/') {
ch = '\n';
break;
}
}
}
if (flag_1 == 0)
fputc('/', out);
}
if (ch == '"') {
fputc(ch, out);
while ((ch = fgetc(in)) not_eq '"') {
fputc(ch, out);
}
}
fputc(ch, out);
}
fclose(in);
fclose(out);
return 0;
}
一个多小时以来,我一直在尝试补充/更改程序,但初学者的知识不允许我掌握这项任务。我很乐意听取您的建议!
为了忽略转义的换行符,即 \
后跟换行符的序列,您可以使用透明处理此问题的函数。
还要注意这些问题:
ch
必须定义为int
才能正确处理EOF
。<iso646.h>
中定义的宏使代码的可读性降低。\
应该在解析字符串的时候处理- 字符常量也应该被解析:
'//'
是一个有效的字符常量,不是注释。
// Function for output to console\
ns2
/\
*\ This is a valid comment too :)
*\
/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int mygetc(FILE *in) {
for (;;) {
int c = getc(in);
if (c == '\') {
c = getc(in);
if (c == '\n')
continue;
if (c != EOF)
ungetc(c, in);
c = '\';
}
return c;
}
}
int skip_line_comment(FILE *in) {
int c;
while ((c = mygetc(in)) != '\n' && c != EOF)
continue;
return c;
}
int skip_block_comment(FILE *in) {
int c;
for (;;) {
while ((c = mygetc(in)) != '*') {
if (c == EOF)
return c;
}
while ((c = mygetc(in)) == '*')
continue;
if (c == EOF)
return c;
if (c == '/')
return ' ';
}
}
int main() {
FILE *in = fopen("inp.c", "r");
FILE *out = fopen("out.c", "w");
int ch;
while ((ch = mygetc(in)) != EOF) {
if (ch == '/') {
ch = skip_line_comment(in);
} else
if (ch == '*') {
ch = skip_block_comment(in);
} else
if (ch == '"' || ch == '\'') {
int sep = ch;
fputc(ch, out);
while ((ch = mygetc(in)) != sep && ch != EOF) {
fputc(ch, out);
if (ch == '\') {
ch = mygetc(in);
if (ch == EOF)
break;
fputc(ch, out);
}
}
}
if (ch == EOF)
break;
fputc(ch, out);
}
fclose(in);
fclose(out);
return 0;
}