最近在看K&R的《C程序设计语言》(第2版)和川合秀实的《30天自制操作系统》,虽然有往Github上提代码,但没有写博客了。也不知道有什么可写的。
今天在《C程序设计语言》的习题答案中看到了1-23的一个测试用例,试了下发现我的答案有一个Bug,所以把Bug改掉了。
觉得值得小小的纪念一下,就把代码传到博客上来吧。
Exercise 1-23. Write a program to remove all comments from a C program. Don’tforget to handle quoted strings and character constants properly. C comments don’tnest. (Page 42)
#include <stdio.h>
#define MAXLINE 1000
char line[MAXLINE];
int getline(void) {
int c, i;
extern char line[];
for ( i=0; i<MAXLINE-1 && ( c=getchar()) != EOF && c != '\n'; ++i)
line[i] = c;
if(c == '\n') {
line[i] = c;
++i;
}
line[i] = '\0';
return i;
}
int main() {
int comment = 0; // 注释
int doubleslash = 0; // 双斜线,注释
int quote2 = 0; // 双引号,字符串
int quote1 = 0; // 单引号,字符
int len;
while((len = getline()) > 0) {
for(int i=0; i<len-1; i++) {
if(comment) {
if(doubleslash == 0 && line[i] == '*' && line[i+1] == '/') {
comment = 0;
i++;
}
} else {
if(line[i] == '\\') {
putchar(line[i]);
putchar(line[++i]);
} else if(line[i] == '"') {
if(quote1 == 0)
quote2 = 1 - quote2;
putchar(line[i]);
} else if(line[i] == '\'') {
if(quote2 == 0)
quote1 = 1 - quote1;
putchar(line[i]);
} else {
if(!quote2 && line[i] == '/' && line[i+1] == '*') {
comment = 1;
i++;
} else if(!quote2 && line[i] == '/' && line[i+1] == '/') {
comment = 1;
doubleslash = 1;
i++;
} else {
putchar(line[i]);
}
}
}
}
if(!comment)
putchar(line[len-1]);
if(doubleslash) {
doubleslash = 0;
comment = 0;
putchar(line[len-1]);
}
}
}