删除C文件中的注释

删除C文件中的注释

今天是C语言课后的一道题目,感觉比较有趣,刚开始一直没有相通,花了很长时间,后来想到了一种解决办法,在这里分享一下,有其他办法的也可在评论区留言大家交流。

题目描述

删除文件中的注释:将C语言源程序(hello.c)文件中的所有注释去掉后存入另一个文件(new_hello.c)

问题分析

注释有两种,多行注释(“/* /”)和单行注释(“// ”)。
解决思路如下:
逐个对文件一中的字符进行分析,遇到字符’/‘进入下一步分析,否则直接将该字符存入文件二中。
当前一个字符为’/’,第二个字符可分为三种情况,
①第二个字符为’/’,则此时注释符为单行注释,此时文件一中该行剩余的字符都将不再输入文件二,直到遇到换行符结束循环。
②第二个字符为’
’,则此时注释符为多行注释,这种情况下,需要找到“/”,直到“/”之前的字符都将不再输出到文件二。这种情况下我想了很长时间如何实现,我的解决办法是,读到’'后将使用fgets函数每次读入两个字符,使用strstr函数判断读入的字符是否为“/”,若是则退出循环,否则将文件指针后移一位,然后接着读入两个字符进行判断(主要是为了防止“**/”的情况)。
③第二个字符是其他字符,此时第一个字符不构成注释符,使用fseek函数将文件指针后移两位,重新读写‘/’ 。

程序运行效果

删除文件注释

程序源代码

/*将原文件中的注释删除后存储到另一个文件中*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
	FILE *fp1, *fp2;
	char ch;
	char comment[2];
	/*打开读出数据的文件*/ 
	if((fp1 = fopen("F:\\201801\\C语言\\第十二次作业\\hello.c", "r")) == NULL)
	{
		printf("File open error!\n");
		exit(0);
	}
	/*打开写入数据的文件*/
	if((fp2 = fopen("F:\\201801\\C语言\\第十二次作业\\new_hello.c", "w")) == NULL)
	{
		printf("File open error!\n");
		exit(0);
	}	 
	/*对文件1中的字符进行处理*/
	while(!feof(fp1)){
		ch = fgetc(fp1);
		if(ch == EOF)
			continue;
		if(ch == '/'){
			ch = fgetc(fp1);
			//单行注释 ,遇到换行符结束,结束后需输出换行符 
			if(ch == '/'){
				while(ch != '\n' && ch != EOF){
					ch = fgetc(fp1);
				}
				fputc('\n',fp2);
			}
			/*跨行注释,遇到结束符结束,每次读入两个字符进行比较,若不是则退回一个字符,继续比较*/ 
			else if(ch == '*'){
				fgets(comment, 3, fp1);
				while(strstr(comment, "*/")==NULL){
					fseek(fp1, -1L, SEEK_CUR);
					fgets(comment, 3, fp1);
				}				
			}
			//不是注释符,只是单纯的'/'符号,则退回两个字符,读写'/' 
			else{
				fseek(fp1, -2L, SEEK_CUR);
				ch = fgetc(fp1);
				fputc(ch, fp2);
			}			
		}
		else{
			fputc(ch,fp2);
		}		
		
	} 	 
	//关闭文件
	if(fclose(fp1)){
		printf("Can not close the file! \n");
		exit(0);
	} 
	//关闭文件
	if(fclose(fp2)){
		printf("Can not close the file! \n");
		exit(0);
	} 
	printf("处理结束\n");
	return 0;
} 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值