【计导作业】文件——过滤注释

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

转载于:https://www.cnblogs.com/flipped/p/5347905.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值