前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【计导作业】文件——过滤注释

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

作者头像
饶文津
发布2020-06-02 15:30:32
6700
发布2020-06-02 15:30:32
举报
文章被收录于专栏:饶文津的专栏饶文津的专栏

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");

}

分析

一个个字符读取判断,不然。。读整行判断挺麻烦的。

代码

代码语言:javascript
复制
#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

代码语言:javascript
复制
#include<stdio.h>
/*
*wocao
*/
int main(){
    printf("//hello/**/,w\"orl//d!\n""111""wocao=");//asdf
    return 0;
}
/**/

after.c

代码语言:javascript
复制
#include<stdio.h>

int main(){
    printf("//hello/**/,w\"orl//d!\n""wocao=");
    return 0;
}

评论区的样例:

before.c

代码语言:javascript
复制
else if(c=='"')//把双引号及之间的所有字符直接输出
{
fputc('"',f2);
while((c=fgetc(f1))!=EOF&&c!='"') //遇到不是‘“’的情况
{
if(c=='\\');//读到'\'先输出‘\’,再输出后面一个字符
}

after.c

代码语言:javascript
复制
else if(c=='"')
{
fputc('"',f2);
while((c=fgetc(f1))!=EOF&&c!='"') 
{
if(c=='\\');
}

续行符的情况

befor.c

代码语言:javascript
复制
#include<stdio.h>
int main()
{
        char c;
    while((c=getchar())!='\n')//hhh\
        这里还是注释哦/*2*/\
        这里也是注释*/
        /*这里还是注释
        */
    {
        if(isdigit(c))
        {
            printf("数字"\//这里是\
                   注释
                   );
        }
    };
    return 0;
}

after.c

代码语言:javascript
复制
#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 遇到续行符的处理。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-04-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分析
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档