admin管理员组文章数量:1660165
编译预处理(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/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:
版权声明:本文标题:编译预处理(文件读入并输出文件,删除注释、回车、换行和多余空格) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1729846090a1215147.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论