编写程序删除C语言程序里的所有注释语句。正确处理带有引号的字符串和字符常量,注释不允许嵌套。(包含文件操作)(含详细解释)

/*
分析:注释语句,有现在使用的这种多行注释,还有//这种单行注释,注意不能嵌套哈
      那么怎么实现呢,还要避免是带有引号的字符串和字符常量,我想到的是当遇到
	  了双引号或者单引号在遇到下一个之前都不管括号里是什么,假如没有在单双引号
	  里面,如果遇到了/就判断下一个是*还是/,若下一个是*就直接删除到下一个*和/
	  处,若是/,就删除到遇到换行符号,调用函数我觉得是最好用在这种判断里面的,很方便
	  这里我还用到了文件的相关操作。
*/

//开始前可以新建一个文本文档,用于之后的文件操作,不新建也可以,后续打开没有的话会自己创建
/*这里我是创建了一个文本文件然后用之前写的一个简单的C语言程序来测试,把他通过文件操作写入
  文本文件,然后编写程序对文本文件进行删除
*/
#include<stdio.h>
#include<stdlib.h>
char Fin1(FILE *fp1,FILE *fp2,char temp);
char Fin2(FILE *fp1,FILE *fp2,char temp);
int main()
{
	FILE *fp1,*fp2;   //文件指针
	fp1=fopen("继续.cpp","rb");     //打开两个文件,注意要使用fread这些函数要使用二进制打开文件,具体可以去翻翻书,都有写到的
	fp2=fopen("wenjian.txt","wb");     //继续.cpp就是当前我写的这个程序用来测试的,你们可以自己去写一个简单的,随便都行,wenjian.txt就是我新建的文本文件,注意位置最好在一个文件夹下面,否则你还需要去输入相应的地址,有点麻烦
	if(fp1==NULL||fp2==NULL)    //判断打开是否成功
	{
		printf("打开失败!!\n");
		exit(0);
	}
	char temp;           //定义一个中间变量
	fread(&temp,sizeof(char),1,fp1);  //这里我使用的是逐个字符写入到文本文件,还有其他方法,具体就自己多去探索
	                                  //这里括号里的意思就是从fp1中读取1个sizeof(char)字节的数据块到temp中
	while(!feof(fp1))
	{
		//这里我是想直接用条件判断然后将删除完的小c程序复制到文本文件,可以的话你们也可以自己再把删除后的文本文件的粘贴回去小c程序
		//接下来的可能看起来会有一点复杂,我尽量说明白,希望你们想看的也认真看

		//这里表示遇到了双引号或者单引号,也就是说是字符串常量或者是字符常量,我们就调用函数直接输出这一串
		if(temp=='\"'||temp=='\'')     
		{
			fwrite(&temp,sizeof(char),1,fp2);     
			temp=Fin1(fp1,fp2,temp);    
		}
		else if(temp=='/')     //到这里的话表示我们可能会遇到单行或者是多行注释,至于是不是我们需要接下来调用函数进行判断
		{
			temp=Fin2(fp1,fp2,temp);     //因为这里可能属于我们要删除的范围,所以先不写入文本文件,等到判断完毕之后再看要不要输入
		}
		else     //到这里就表示不属于任何一种我们要删除和判断的情况,直接输出读入就好
		{
		fwrite(&temp,sizeof(char),1,fp2);
		fread(&temp,sizeof(char),1,fp1);
		}

	}
	fclose(fp1);   //操作完成后关闭文件
	 fclose(fp2);  
	//可以去运行一下试试,运行完毕后点开你的文本文件看就会发现那个小c程序的内容全部都过滤删除了一下我们要删除的内容然后写入到了文本文件里面
	return 0;
}
char Fin1(FILE *fp1,FILE *fp2,char temp)     //这属于判断特殊情形,也就是字符串和字符常量,这里的文件指针跟我们平常的指针差不多,
                                         //也就是逐个去读取读入,位置发生变化,所以这里在判断时的读入写出就也相当于主程序里的读入写出,都发生变化
{
	char ton;     //定义一个中间变量
	fread(&ton,sizeof(char),1,fp1);     //给他读入一个然后去跟temp比较
	while(ton!=temp)     //一直比较到等于temp,因为是"",'',开始结束标志相同
	{
		fwrite(&ton,sizeof(char),1,fp2);     //一直读入写入
		fread(&ton,sizeof(char),1,fp1);
	}
	fwrite(&ton,sizeof(char),1,fp2);     //到这里表示这种特殊情况结束,但是不要忘记输入结束标志,也就是"或者',然后读入返回给temp
	fread(&ton,sizeof(char),1,fp1);
	return ton;
}
char Fin2(FILE *fp1,FILE *fp2,char temp)     //这里就是判断是不是要删除的注释
{
	char ton;
	fread(&ton,sizeof(char),1,fp1);     //也是先定义一个中间变量,然后从小c程序读入一个值给他
	if(ton=='/')     //假如ton是/表示他是单行注释,我们就需要在换行符之前一直读入,直到遇到换行符
	{
		while(ton!='\n')
		{
		    fread(&ton,sizeof(char),1,fp1);
		}
		fwrite(&ton,sizeof(char),1,fp2);     //注意换行符不要删除,要写入文本文件,虽然看不见,但是到时候写回去C语言程序就能看见了吧
		fread(&ton,sizeof(char),1,fp1);     //再读入一个返回给temp;
		return ton;
	}
	if(ton=='*')     //这表示是多行注释
	{
		while(!feof(fp1))     //一直到文件末尾我们都要判断
		{
			fread(&ton,sizeof(char),1,fp1);    //再读入一个给ton
			if(ton=='*')     //假如下一个是*
			{
				fread(&ton,sizeof(char),1,fp1);     //再读入一个
				if(ton=='/')     //假如下一个是/,表示多行注释结束
				{
					fread(&ton,sizeof(char),1,fp1);     //读入下一个给ton,返回给temp
					return ton;
				}
			}
			     //否则就一直读入判断不写入
		}
	}
	fwrite(&ton,sizeof(char),1,fp2);     //这里表示遇到的既不是单行注释也不是多行注释,直接写入然后读入一个给ton返回给temp
	fread(&ton,sizeof(char),1,fp1);
	return ton;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值