实验12_4_过滤注释

 C语言的注释分为两种,第一种:在一行源代码中“//”后的内容为注释内容。第二种:“/*”与“*/”之间的内容为注释内容。第三种:程序中只出现了“/*”,没有“*/”与之对应,那么将“/*”后的全部内容都要过滤掉。注意,只要是注释内容,那么注释内容中的字符应该全部忽略,即不起任何的作用。例如“/*”与“*/”之间如果再有“//”,那么“//”不应起作用;如果“//”再有“/*”,那么“/*”也不应起作用。
你的任务是先打开一个名字为dict.dic的文本文件,该文件中前5行每行为1个整数,从第6行开始为5段C语言的源代码。那5个数字代表这5段源代码结束的行数,比如如果第一行的整数为20,第二行的整数为60,则表示从第6行到第20为第一段代码,从第21行到第60为第二段代码。然后根据输入要求将源代码中所有注释过滤掉。
在本过滤注释系统中,你可以忽略源文件中双引号导致“//”、“/*”、“*/”失去作用的情况,即只要“//”、“/*”、“*/”不是注释内容,在任何情况下都起作用。

输入

只可能是1,2,3,4,5之一

输出

输入为1则输出第一段代码过滤后的结果,输入为2则输出第二段代码过滤后的结果,依此类推。

样例输入
1
样例输出
如果第一段代码是这样:
/*
	@Author: BUPT
	@Date: 2010 8 26
*/

#include<stdio.h>

int main()
{
	int a = 10 , b = 2 , c ;
	c = a / b ; //I just want to test '/'
	printf("I love programming C.\n") ; //"printf" is a useful function /*
	printf("I hope you love it too!\n") ;
	/*
	//C is not always hard , if you love it , it will not treat you rough.
	*/
	return 0 ;
}

则输出是这样:


#include<stdio.h>

int main()
{
        int a = 10 , b = 2 , c ;
        c = a / b ;
        printf("I love programming C.\n") ;
        printf("I hope you love it too!\n") ;

        return 0 ;
}

一开始看错题了,有很多遗留下来的屎山.

#include <stdio.h>
#include <stdlib.h>
void five(int a[6], FILE* fp);
void skip(FILE* fp, int k);
void delete(FILE* fp, int k);
int main()
{
    int i;
    FILE* fp = fopen("dict.dic", "r");
    int a[6] = { 0,0,0,0,0,0 };
    five(a, fp);
    a[4] = a[4] - a[3];
    a[3] = a[3] - a[2];
    a[2] = a[2] - a[1];
    a[1] = a[1] - a[0];
    a[0] = a[0] - 5;
    int n = 7788;
    scanf("%d", &n);
    int sum = 0, key = a[n - 1];
    for (i = 0; i < n - 1; i++)
        sum += a[i];
    skip(fp, sum);

    delete(fp, key);
    fclose(fp);
    return 0;
}
void five(int a[6], FILE* fp)
{
    char c;
    for (int i = 0; i <= 4; i++)
    {
        c = fgetc(fp);
        while (c != 10)
        {
            a[i] = a[i] * 10 + (c - '0');
            c = fgetc(fp);
        }
    }
}
void skip(FILE* fp, int k)
{
    char c;
    while (k)
    {
        c = fgetc(fp);

        while (c != 10)
            c = fgetc(fp);
        k--;
    }
}
void delete(FILE* fp, int k)
{

    char c, c2, c3, c4;
    int mod = 0;// 0 ,1// ,2/*
    while (1)
    {
        if (k <= 0)
            break;
        if (mod == 1)
        {
            while (c != 10)
                c = fgetc(fp);
            k--;
            mod = 0;
            printf("\n");
            if (k <= 0)
                return 0;
        }
        else if (mod == 2)
        {
            c3 = fgetc(fp);
            c4 = fgetc(fp);
            while (1)
            {
                if (c3 == '*' && c4 == '/')
                    break;
                if (c3 == 10)
                    k--;
                if (k <= 0)
                    return 0;
                c3 = c4;
                c4 = fgetc(fp);
            }
            mod = 0;
        }

        c = fgetc(fp);
        if (c == 10)
        {
            k--;
            if (k <= 0)
                break;
        }
        if (c == '/')
        {
            c2 = fgetc(fp);
            if (c2 == '/')
            {
                mod = 1;
                continue;
            }
            else if (c2 == '*')
            {
                mod = 2;
                continue;
            }
            else if (c2 == 10)
            {
                printf("%c%c", c, c2);
                k--;
                if (k <= 0)
                    break;
            }
            else
            {
                printf("%c%c", c, c2);
            }
        }
        else
            printf("%c", c);

    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值