看前须知
第二次上机题汇总
题目内容
问题描述
【问题描述】
编写程序将一个指定文件中某一字符串替换为另一个字符串。要求:(1)被替换字符串若有多个,均要被替换;(2)指定的被替换字符串,大小写无关。
输入形式
给定文件名为filein.txt。从控制台输入两行字符串(不含空格,行末尾都有回车换行符),分别表示被替换的字符串和替换字符串。
输出形式
将替换后的结果输出到文件fileout.txt中。
样例
从控制台输入两行字符串:
in
out
文件filein.txt的内容为:
#include <stdio.h>
void main()
{
FILE * IN;
if((IN=fopen("in.txt","r"))==NULL)
{
printf("Can’t open in.txt!");
return;
}
fclose(IN);
}
【样例输出】
文件fileout.txt的内容应为:
#outclude <stdio.h>
void maout()
{
FILE * out;
if((out=fopen("out.txt","r"))==NULL)
{
prouttf("Can’t open out.txt!");
return;
}
fclose(out);
}
样例说明
输入的被替换字符串为in,替换字符串为out,即将文件filein.txt中的所有in字符串(包括iN、In、IN字符串)全部替换为out字符串,并输出保存到文件fileout.txt中。
题解
易错点和难点
本题的难点就在于怎么实现查找和替换,对于查找而言,只要一出现与替换字符串开头相匹配的字母是就开始查找,一旦发现匹配失败,就立刻退出,匹配失败,输出原文。如果匹配成功,就输出替换内容,同时跳过替换的字符串(这里要小心),再对文后面进行同样的步骤。
参考代码
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
int main()
{
char in[100],replace[100]; //in是要替换的字符串,replace是替换后的字符串
char contain[999];//存文章
int i,j,k,l_in=0,l_contain=0,l_replace=0,sgn=0;
char charac;
FILE *fp1 = fopen("filein.txt","r");
FILE *fp2 = fopen("fileout.txt","w");
if(fp1==NULL||fp2==NULL)
{
printf("Can nou find this file");
}
else
{
scanf("%s",in);
scanf("%s",replace);
l_in=strlen(in);
l_replace=strlen(replace);
for(i=0;i<strlen(in);i++)
{
in[i]=tolower(in[i]);//全部变为小写
}
for(i=0;i<strlen(replace);i++)
{
replace[i]=tolower(replace[i]);//全部变为小写
}
charac=fgetc(fp1);//读入txt文件
i=0;
while(charac!=EOF)
{
contain[i]=charac;
i++;
charac=fgetc(fp1);
}
l_contain=strlen(contain);
for(i=0;i<l_contain;i++)
{
sgn=0;
if(tolower(contain[i])==tolower(in[0]))//开始匹配查找
{
for(j=1;j<l_replace;j++)
{
if(tolower(contain[i+j])!=tolower(in[j])) sgn=1;//匹配失败
}
if(sgn==0)//若完全匹配
{
for (k = 0; k < l_replace; k++)//替换
{
fputc(replace[k], fp2);
}
i = i + l_in - 1;//跳过已经替换的字符
}
else
{
fputc(contain[i],fp2);//输出匹配失败的原文
}
}
else
{
fputc(contain[i],fp2);//输出非替换原文
}
}
}
fclose(fp1);
fclose(fp2);
return 0;
}
补充测试的数据
如果查找和替换算法实现,没有其他要注意的。