笔试题:04年_字符串替换

#include 
#include 
#include 

//程序由:HyperHorse整理,如有错误,请指出,谢谢
//编写一段函数,满足以下要求:将字符串s1中出现的所有s2替换为s3,并且不损坏字符串
//思路:1寻找子串的起始位置,2字符串移出足够空间,3替换字符串
//函数bug:若str长度较小,在进行多替换少时,可能内存溢出

char* replaceStr(char* str,char* strSub,char* strRep)
{
	if(NULL == str || NULL == strSub || NULL == strRep)//判空
	{
		printf("您给定的字符串为空,麻烦您再检查一下呗!");
		return NULL;
	}
	int iSubLen = strlen(strSub);
	int iRepLen = strlen(strRep);
	int iDiffLen = iSubLen - iRepLen;
	int i = 0;
	while('\0' != str[i])
	{
		int iBegin = i;//记录初始位置
		int iEnd = i;//记录结束位置
		int j = 0;

		//寻找子串在原始字符串中的起始位置
		while('\0' != strSub[j])
		{
			if(str[iEnd] == strSub[j])
			{
				iEnd++;
				j++;
			}
			else
			{
				break;
			}
		}

		//进行字符串的移位操作
		if('\0' == strSub[j] )//表明找到了子串
		{
			if(iDiffLen >=0 )//表明子串的长度>=替换字符串的长度时,需要将原始字符串中从iEnd处向前移动iDiffLen长度
			{
				for(int k = iEnd ; k < strlen(str) ; k++)//从前向后依次移动,注意要置从strlen(str)-1 到 strlen-iDiffLen的字符置为结束符
					//直接将strlen-iDiffLen的字符置为结束符
				{
					//str[k] = str[k-iDiffLen];//前=后
					str[k-iDiffLen] = str[k];
				}
				str[strlen(str)-iDiffLen] = '\0';//非常容易错,要置结束符,否则少替换多就会发生错误
			}
			else//表明子串的长度 < 替换字符串的长度时,需要将原始字符串中从原始字符串末尾处向后移动 -iDiffLen长度
			{
				for(int k = strlen(str) - 1 ; k >= iEnd ; k--)//从后向前依次移动
				{
					//str[k] = str[k-iDiffLen];
					str[k-iDiffLen] = str[k];//后=前,易错
				}
			}
			
			//全部移动结束后,开始进行字符串替换,替换时,将原始字符串中从iBegin到iBegin + iRepLen -1 (包括iBegin和iBegin + iRepLen -1 )处的
			//的所有字符替换掉
			for(int k = iBegin,p = 0; k < iBegin + iRepLen ; k++ , p++)
			{
				str[k] = strRep[p];
			}

			//更新下一次查找位置
			i = iBegin + iRepLen;
		}
		else//没有找到子串
		{
			i++;
		}
	}
	return str;
}

int main(int argc,char* argv[])
{
	//char str[1024] = "1machao1machao1";
	//char strSub[1024] = "machao";
	//char strRep[1024] = "maxiping";
	//printf("该字符串的长度strlen是:%d\n",strlen(str));//strlen求得的是在结束符之前的所有字符的长度
	//printf("该字符串的长度sizeof是:%d\n",sizeof(str));//sizeof求得的是数组声明的大小
	//printf("原始字符串是:%s\n",str);
	//printf("用%s将%s替换后的字符串是:%s\n",strRep,strSub,replaceStr(str,strSub,strRep));
	char str[1024];
	char strSub[1024];
	char strRep[1024];
	while(NULL != gets(str))
	{
		gets(strSub);
		gets(strRep);
		printf("%s\n",replaceStr(str,strSub,strRep));
	}
	system("pause");
	getchar();
	return 0;
}

你可能感兴趣的:(笔试题)