BUAA(2021春)字符串替换(新)——朴素的查找和替换

48 篇文章 154 订阅

看前须知

要点介绍和简要声明.

第二次上机题汇总

五子棋危险判断——简单的搜索算法.

字符串替换(新)——朴素的查找和替换.

加密文件——分步骤一步一步有逻辑性完成.

通讯录整理——结构体一级排序.

小型图书管理系统.

题目内容

问题描述

【问题描述】

编写程序将一个指定文件中某一字符串替换为另一个字符串。要求:(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&rsquo;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&rsquo;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;
}

补充测试的数据

如果查找和替换算法实现,没有其他要注意的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值