当日总结
vigoss18在某997工作制的公司上班,终于有一天爆发了,决定要跑路。
既然要跑路了,当然得对自己的代码做点手脚,既要保证走了之后代码仍然可以运行,又要保证走了之后别人维护不了,所以决定写个程序,用来批量把代码中的注释全部删掉。
vigoss18是一个强烈的强迫症患者,他的代码都符合下面这些规则:
1.所有的注释都是//风格的,两个星号中间的内容为注释内容,需要把这个符号和里面的内容全部去掉
2.代码中经常会出现引号,用来表示字符串,如果//出现在引号内部,那么就认为不是注释,是不能被去掉的
3.vigoss18的代码保证不会出现//镶套,但是可能会出现/*//和/**//这种情况,对于前者,有两个/,第一个先匹配,第二个/被认为是注释内部的内容;对于后者,第一个/被匹配,第二个/找不到左边匹配的,所以被认为是文本,需要保留下来。
4.代码中可能会出现一半注释符号,比如单独的/,或者单独的/,这个时候认为不是注释,需要保留下来.
5.注释外的引号,保证一定是合法的,即每个引号一定是有对应的另一个引号成对匹配的。
6.代码中可能会出现引号前面有反斜杠的情况,那么这时引号会被转义,只被认为是个单纯的符号,不起到匹配字符串的效果。
7.代码保证只有引号才有转义的情况发生,即除了引号,其他符号都不需要考虑前面有反斜杠然后被转义。
输入描述:
对于每个输入文件,处理到文件尾。
输入如题意描述,保证单个输入文件不超过5kb
输出描述:
输出去掉注释以后的内容,除了注释以外的内容全部需要输出,卿不要漏掉换行空格之类的。
示例1
输入
复制
a b/666
2333/c" lihai/le/"/666/"
/
输出
复制
a bc" lihai/le/"/666/"
/#include<stdio.h>
int main()
{
int ch =0,next=0,t=0;
while((ch=getchar())!=EOF)
{
if(ch'\')
{
if((next=getchar())'"')
{
putchar(ch);
putchar(next);
}
else
{
putchar(ch);
if(next!=EOF)ungetc(next,stdin);
}
}
else if(ch'"')
{
putchar(ch);
while((next=getchar())!=EOF)
{
if (next == '\')
{
putchar('\');
t = getchar();
if (t == EOF) break;
putchar(t);
continue;
}
putchar(next);
if (next == '"') break;
}
}
else if(ch'/')
{
int next = getchar();
if (next == '') {
static char buf[60000];
int k = 0, closed = 0;
int x = getchar(), y;
while (x != EOF) {
if (x == '*') {
y = getchar();
if (y == '/') { closed = 1; break; }
if (k < (int)sizeof(buf)) buf[k++] = '*';
x = y;
} else {
if (k < (int)sizeof(buf)) buf[k++] = (char)x;
x = getchar();
}
}
if (!closed) {
putchar('/');
putchar('*');
for (int i = 0; i < k; ++i) putchar(buf[i]);
}
} else {
putchar('/');
if (next != EOF) ungetc(next, stdin);
}
}
else
{
putchar(ch);
}
}
return 0;
}

浙公网安备 33010602011771号