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 遇到续行符的处理。