




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、例9-16 输入三个字符串,将字符串1中所有与字符串2相同的子串替换成字符串3。例如,输入的字符串1为"werLOOPouyio3o565p6 LOOPedd",字符串2为"LOOP",字符串3为"NEW",那么替换后,字符串1为"werNEWouyio3o565p6NEWedd"。根据题意,写一个符合要求的函数头。函数有两个char型数组指针的输入参数,一个char型数组指针输出参数,没有返回值。可以定为void replace(char chString,char chOldWord,char chNewWor
2、d),参数分别代表字符串1,字符串2和字符串3。数据要求问题中的常量:#define MAXNUM 200 /*定义数组的最大长度*/问题的输入:char chStr /*字符串1,初始的字符串*/char chOld /*字符串2,要寻找的旧的字符串/ char chNew /*字符串3,要替换的新的字符串/ 问题的输出:char str1 /*字符串1,最终输出的结果字符串,是替换后的字符串*/初始算法1定义三个字符串;2调用库函数初始化三个字符串;3调用函数replace得到最终的字符串;4输出结果字符串;5结束。算法细化算法的主要步骤是第三步,它完成了旧字符串的查找定位和新字符串的替换
3、的功能,具体的步骤细化如下:步骤3的细化 31 初始化临时变量 32 循环计算字符串2(也就是旧的字符串)的长度 33 循环计算字符串3(也就是新的字符串)的长度34 循环查找字符串2是否在字符串1中,如果找到,用字符串3(chNew)替换掉字符串2(chOld)35 函数结束对一次替换的算法,可以分解为3个步骤:查找、调整长度和替换。查找:查找字符串1中是否有字符串2。利用循环可以得到字符串2的长度nLen2。从字符串1的第一个元素开始,比较后面的nLen2个元素是否和字符串2的nLen2个元素完全相同。如果完全相同,则进行步骤2;否则从字符串1的第二个元素开始,继续上述过程 。如果搜索到字
4、符串末尾也不能进行步骤2,则说明字符串1中没有字符串2。调整长度:计算替换后的字符串1长度,调整字符串1。假设字符串1的位置nStartPos后的nLen2个元素与字符串2相同。如果字符串3的长度nLen3大于字符串2的长度nLen2,那么字符串1的位置nStartPos+nLen2后的所有元素向后移动nLen3nLen2位;否则,向前移动nLen2nLen3位。这样处理后,字符串1中不需要替换的部分已经调整完毕。替换:利用循环,把字符串1的位置nStartPos后的nLen3个元素换成字符串3。替换字符串1中的所有字符串2,可以利用循环对上述算法作适当扩展即可。每次替换总是从新的nStart
5、Pos位置开始进行。但是一定要注意,每次替换后字符串1的长度可能发生变化,nLen1每次要重新计算。流程图图5-17 程序执行流程图程序代码如下:#include “stdio.h”#define MAXNUM 200void replace(char chString,char chOldWord,char chNewWord)int i,nStartPos=0,nLen1=0,nLen2=0,nLen3=0,nFound;/*计算旧词和新词的长度*/while(chOldWordnLen2+!='0');nLen2-;while(chNewWordnLen3+!='
6、0');nLen3-;/* chString中可能有多个旧词,均要替换为新词;利用循环向前拨动查找位置,逐次进行比较和替换*/while(chStringnStartPos!='0')/*从nStartPos位置开始,Len2长度的字符串是否和旧词相同?*/nFound=1;for(i=0;i<nLen2;i+)if(chStringnStartPos+i!=chOldWordi)nFound=0;break;if(nFound=1)/*相同,这Len2个字符需要被替换掉*/*计算输入字串chString 的长度,注意在循环中每次计算chString 长度是必要的
7、,因为完成一次替换后,chString的长度可能发生变化*/while(chStringnLen1+!='0');nLen1-;/*新词、旧词长度可能不同,先将chString长度调至正确的位置,chString中nStartPos 后的字符可能需要前移或后移若干位*/if(nLen3-nLen2>=0)/*新词比旧词长,从后向前移动*/for(i=nLen1-1;i>=nStartPos;i-)chStringi+nLen3-nLen2=chStringi;else/*新词比旧词短,从前向后移动*/for(i=nStartPos+nLen2;i<nLen1;
8、i+)chStringi+nLen3-nLen2=chStringi;chStringnLen1+nLen3-nLen2='0'/*将新词复制到chString,替换原来的旧词 */for(i=0;i<nLen3;i+)chStringnStartPos+i=chNewWordi;/*下一次检查的位置:从替换后新词后面的位置开始*/nStartPos+=nLen3;else/*不同,则从下一个字符开始,继续进行检查*/nStartPos+;main()char chStrMAXNUM,chOldMAXNUM,chNewMAXNUM;/*输入原始字符串、被替换串和替换串*/
9、printf("nPlease input the original string:n");gets(chStr);printf("Please input the word to be replaced:n");gets(chOld);printf("Please input the new word to replace:n");gets(chNew);/*调用函数进行替换*/replace(chStr,chOld,chNew);/*输出结果*/printf("The processed string = %s"
10、;,chStr);分析程序运行结果如下:Please input the original string:Tom want to go to school, Tom's father said.Please input the word to be replaced:TomPlease input the new word to replace:JimmyThe processed string = Jimmy want to go to school, Jimmy's father said.函数replace也可以使用递归函数实现,下面是使用递归和指针的一个例子(main函
11、数可以不做改动)。#include "stdio.h"void replace(char *pszString,char *pszOldWord,char *pszNewWord)int i,nLenOld=0, nLenNew=0;char *pszPos;/*计算旧词和新词的长度*/while(*(pszOldWord+nLenOld) nLenOld+;while(*(pszNewWord+nLenNew) nLenNew+;/*从当前指针pszString开始查找并替换一个旧词*/while(*pszString!='0')/*从当前位置开始查找,如
12、果找到,pszPos为 pszString前移nLenOld 长度*/pszPos=pszString;for(i=0;i<nLenOld;i+)if(*(pszOldWord+i)!=*pszPos)pszPos=NULL;break;pszPos+;if(pszPos!=NULL)/*找到了,进行替换*/if(nLenNew<nLenOld) /*新词比旧词短,从前向后移动*/while(1)*(pszPos-nLenOld+nLenNew)=*pszPos;if(*pszPos+='0')break;else if(nLenNew>nLenOld) /*新词比旧词长,从后向前移动*/while(*pszPos+);while(pszPos>=pszString+nLenOld)*(pszPos-nLenOld+nLenNew)=*pszPos;pszPos
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论