通过标记状态“在字符中”,“在字符串中”,“在行注释//中”,“在段注释中/* */”,来决定是否继续往前读。
#include<stdio.h>
#include<stdlib.h>
#define MAX 4000
/* remove the comments in the code
test if it works? */
// test if it works?
int main(void){
char code[MAX];
int i;
int c, s, line, para;
int escape, slash, star;
c = s = line = para = 0; // mark the state when in '', "", // and /* */
escape = slash = star = 0; // mark the \, / and *
for(i = 0; i < MAX-1 && (code[i] = getchar()) != EOF; ++i){
// in ''?
if(code[i] == '\'' && c && escape == 0){
c = 0;
}
else if(code[i] == '\'' && !c && !s && !line && !para){
c = 1;
}
// in ""?
if(code[i] == '"' && s && escape == 0){
s = 0;
}
else if(code[i] == '"' && !c && !s && !line && !para){
s = 1;
}
// in line comment //?
if(line && code[i] == '\n'){
line = 0;
}
else if(!c && !s && !line && !para && code[i] == '/' && slash == 1){
line = 1;
--i;
}
// in paragraph comment /* */?
if(para && code[i] == '/' && star == 1){
para = 0;
--i;
}
else if(!c && !s && !line && !para && code[i] == '*' && slash == 1){
para = 1;
--i;
}
// mark escape sequence
if(code[i] == '\\'){
if(escape == 1){
escape = 0;
}
else escape = 1;
}
else escape = 0;
// mark the * in paragraph comment
if(para && code[i] == '*' && slash == 0){
star = 1;
}
else star = 0;
// mark the first /
if(!c && !s && !line && !para && code[i] == '/'){
slash = 1;
}
else slash = 0;
// if in comment
if(line || para){
--i;
}
}
code[i] = '\0';
printf("%s", code);
system("pause");
return 0;
}