1. 将一个.c文件1复制到另一个文件2中,要求过滤掉文件1中的注释。
注释类型:以//开头或者/**/中的注释。用一个函数完成该功能。
基本要求:假设//或者/**/不会出现在printf语句中。
高级要求:要能处理printf中的//或者/**/
练习目的:练习文件的基本操作
//klkl//kk;;l/*l;;l*/
/*klklk/*k;k;l
lklkl*/
/*klklkl//klklkl*/
/*上述红色字体部分都是注释*/
main()
{
printf("here // should not be handled as comment");
printf("here /* .. */ should not be handled as comment");
}
分析
一个个字符读取判断,不然。。读整行判断挺麻烦的。
代码
#include<stdio.h> int main() { char c; FILE *f1=fopen("before.c","r");//只读方式打开未注释的文件before.c,f1指向它 FILE *f2=fopen("after.c","w");//只写方式打开after.c,f2指向它 while((c=fgetc(f1))!=EOF)//一个个字符读,读到文件尾 { if(c=='/')//遇到‘/’ { c=fgetc(f1); if(c=='/')//遇到‘//’的情况 { while((c=fgetc(f1))!=EOF){ if(c=='\n')break; if(c=='\\')//如果是续行符 c=fgetc(f1);//跳过 };//后面的字符一直到‘\n’之前的都不用考虑 if(c!=EOF)fputc(c,f2);//把回车写入f2,ok } else if(c=='*')//遇到‘/*’的情况 { while(1) { while((c=fgetc(f1))!=EOF&&c!='*');//在‘*’之前的都pass if(c!=EOF) { if((c=fgetc(f1))!=EOF&&c=='/')//遇到‘*/’了 break;//ok } } } else { fputc('/',f2);//遇到不是注释却又出现‘/’的情况(题目没有说有没有这种情况orz) if(c!=EOF)fputc(c,f2);//把‘/’和下一个字符都写入f2,ok } } else if(c=='"')//把双引号及之间的所有字符直接输出 { fputc('"',f2); while((c=fgetc(f1))!=EOF&&c!='"') //遇到不是‘“’的情况 { if(c=='\\')//读到'\'先输出‘\’,再输出后面一个字符 { fputc(c,f2); c=fgetc(f1); } if(c!=EOF)fputc(c,f2); } fputc('"',f2); } else if(c=='\'')//把单引号及之间的所有字符直接输出 { fputc('\'',f2); while((c=fgetc(f1))!=EOF&&c!='\'') //遇到不是'''的情况 { if(c=='\\')//读到'\'先输出‘\’,再输出后面一个字符 { fputc(c,f2); c=fgetc(f1); } if(c!=EOF)fputc(c,f2); } fputc('\'',f2); } else if(c!=EOF)fputc(c,f2);//其它字符直接输出 } fclose(f1); fclose(f2); return 0; }
欢迎同学们给我找出bug。
yx同学给我找到了一个bug,感谢!现在的代码已经更新,yx的样例:
before.c
#include<stdio.h> /* *wocao */ int main(){ printf("//hello/**/,w\"orl//d!\n""111""wocao=");//asdf return 0; } /**/
after.c
#include<stdio.h> int main(){ printf("//hello/**/,w\"orl//d!\n""wocao="); return 0; }
评论区的样例:
before.c
else if(c=='"')//把双引号及之间的所有字符直接输出 { fputc('"',f2); while((c=fgetc(f1))!=EOF&&c!='"') //遇到不是‘“’的情况 { if(c=='\\');//读到'\'先输出‘\’,再输出后面一个字符 }
after.c
else if(c=='"') { fputc('"',f2); while((c=fgetc(f1))!=EOF&&c!='"') { if(c=='\\'); }
续行符的情况
befor.c
#include<stdio.h> int main() { char c; while((c=getchar())!='\n')//hhh\ 这里还是注释哦/*2*/\ 这里也是注释*/ /*这里还是注释 */ { if(isdigit(c)) { printf("数字"\//这里是\ 注释 ); } }; return 0; }
after.c
#include<stdio.h> int main() { char c; while((c=getchar())!='\n') { if(isdigit(c)) { printf("数字"\ ); } }; return 0; }
bug修复:2016/4/11 8:04 遇到单引号里的双引号不处理。
bug修复:2016/4/12 21:38 遇到续行符的处理。