编译预处理(文件读入并输出文件,删除注释、回车、换行和多余空格)

编译预处理(C语言)

使用文件形式输入源程序,输出也写入文件
实验过程:
1、输入:源程序
2、输出:与处理后的源程序
3、处理结果:没有无用的字符(删除所有注释、回车、换行和多余字符)

实验内容:
1、文件输入源程序

首先准备好文档,使用fopen函数选择读入或写出的方式,采用fgets和fgetc函数进行读取字符或字符串进行相应的处理

fr=fopen(“a.txt”,“r”);从名为a.txt的文档读入文件到程序中
fw=fopen(“b.txt”,“w”);将内容写入到b.txt的文档中

fgets(str,99,fr)将读入文档fr中的内容按行送给字符串str
fgetc(str,fr)表示将fr中的内容按字符送给字符str

fputs(str,fw);将字符串str中的内容写入到fw文档中
fputc(str,fw);将字符str中的内容写入到fw文档中

FILE *fr,*fw;
char str[99];
fr=fopen("a.txt","r");
fw=fopen("b.txt","w");
while(fgets(str,99,fr)!=NULL)
fputs(str,fw);
fclose(fr);
fclose(fw);

表示将文档a.txt内容按行送给字符串str,然后逐行写入文档b.txt中

2、删除注释
根据对字符串的读入,对每行的字符串进行判断,若发现连续两个字符是‘/’,则将该两个字符值赋为‘\0’,然后break到下一行,直到所有字符均以处理完毕

void zhushi(char *str){
	int i,j;
	char ss[99];
	for(i=0;str[i]!=EOF;i++){
		if(str[i]=='/'&&str[i+1]=='/'){
			str[i]='\0';
			str[i+1]='\0';
			break;
		}
	}
	//printf("%s",str);
}

3、删除回车和换行

对每行的字符串进行比较,若发现有字符为‘\r’或’\n’,则将字符改为空字符’\0’,直到所有字符串均已处理完毕

//去除多余的回车和换行 
void enter(char *str){
	int i,j;
	for(i=0;str[i]!=EOF;i++){
		if(str[i]=='\n'||str[i]=='\r'){
			str[i]=32;
		}
	}
}

4、删除多余空格
这一部分请参考我的上一篇博客(删除字符串多余空格)(https://blog.csdn.net/ScottWei_007/article/details/88089539)

5、最后在代码整合的过程中,即换行与回车操作进行完后,可能会使字符串与字符串之间有空格,因此再对所整合后的字符串进行一次多余空格处理即完成。

完整代码如下:

#include<stdio.h>
#include<string.h>

//定义全局变量 
char str[99];
char ss[99]=" ";

//删除文档里的注释 
void zhushi(char *str){
	int i,j;
	char ss[99];
	for(i=0;str[i]!=EOF;i++){
		if(str[i]=='/'&&str[i+1]=='/'){
			str[i]='\0';
			str[i+1]='\0';
			break;
		}
	}
	//printf("%s",str);
}

//删除文档里多余的空格 
void space(char *str){
	int i,j,k;
	for(i=0;str[i]!=EOF;i++){//保留一个空格("a    student"中在a和student之间只需保留一个空格) 
		if(str[i]==32&&str[i+1]==32)
		{
			k=i;
			for(j=i;str[j]!=EOF;j++)
			if(str[j]!=32)
			break;
			for(j;str[j]!=EOF;j++){
				str[k+1]=str[j];
				k++;
			}
		}	
	}
	if(str[0]==32){//处理字符串开头为空格(" a student"中a前面的空格应删去) 
		for(i=0;str[i]!=EOF;i++)
		str[i]=str[i+1];
	}
	for(i=0;str[i]!=EOF;i++){//删去不用字符(“int m, n”中,和n之间的空格应删去) 
		if(str[i]==32){
			if(str[i-1]>='a'&&str[i-1]<='z'&&str[i+1]>='a'&&str[i+1]<='z')
			continue;
			else{
				for(j=i;str[j+1]!=EOF;j++)
				str[j]=str[j+1];
			}
		}
	}
	//printf("%s",str);
}

//去除多余的回车和换行 
void enter(char *str){
	int i,j;
	for(i=0;str[i]!=EOF;i++){
		if(str[i]=='\n'||str[i]=='\r'){
			str[i]=32;
		}
	}
}

//主函数 
int main(){
	FILE *fr,*fw;
	fr=fopen("a.txt","r");//读取文档 
	fw=fopen("b.txt","w");// 存入文档 
	while(fgets(str,99,fr)!=NULL){//对文档里的字符进行按行处理 
		zhushi(str);//注释 
		space(str);//空格 
		enter(str);//回车和换行 
		strcat(ss,str);
	}
	//在回车和换行操作结束后,字符串与字符串之间可能会有空格,
	//因此将所有的字符串合并成一个大字符串再进行一次空格删除的处理 
	space(ss);
	printf("%s",ss);	
	fputs(ss,fw);//存入文档 
	fclose(fr);//关闭文档 
	fclose(fw);
} 

读入文档a
在这里插入图片描述
执行后结果:

在这里插入图片描述
输出文本b:
在这里插入图片描述

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值