C语言题

9-16 输入三个字符串,将字符串1中所有与字符串2相同的子串替换成字符串3。例如,输入的字符串1"werLOOPouyio3o565p6 LOOPedd",字符串2"LOOP",字符串3"NEW",那么替换后,字符串1"werNEWouyio3o565p6NEWedd"

根据题意,写一个符合要求的函数头。函数有两个char型数组指针的输入参数,一个char型数组指针输出参数,没有返回值。可以定为void replace(char chString[],char chOldWord[],char chNewWord[]),参数分别代表字符串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的细化

    31 初始化临时变量

    32 循环计算字符串2(也就是旧的字符串)的长度    

    33 循环计算字符串3(也就是新的字符串)的长度

34 循环查找字符串2是否在字符串1中,如果找到,用字符串3chNew)替换掉字符串2chOld

35 函数结束

对一次替换的算法,可以分解为3个步骤:查找、调整长度和替换。

查找:查找字符串1中是否有字符串2。利用循环可以得到字符串2的长度nLen2。从字符串1的第一个元素开始,比较后面的nLen2个元素是否和字符串2nLen2个元素完全相同。如果完全相同,则进行步骤2;否则从字符串1的第二个元素开始,继续上述过程 。如果搜索到字符串末尾也不能进行步骤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,可以利用循环对上述算法作适当扩展即可。每次替换总是从新的nStartPos位置开始进行。但是一定要注意,每次替换后字符串1的长度可能发生变化,nLen1每次要重新计算。

流程图

5-17 程序执行流程图

程序代码如下:

#include “stdio.h”

#define MAXNUM 200

void replace(char chString[],char chOldWord[],char chNewWord[])

{

       int i,nStartPos=0,nLen1=0,nLen2=0,nLen3=0,nFound;

       /*计算旧词和新词的长度*/

       while(chOldWord[nLen2++]!='\0');

       nLen2--;

       while(chNewWord[nLen3++]!='\0');

       nLen3--; 

       /* chString中可能有多个旧词,均要替换为新词;

利用循环向前拨动查找位置,逐次进行比较和替换*/

       while(chString[nStartPos]!='\0')

       {

              /*nStartPos位置开始,Len2长度的字符串是否和旧词相同?*/

              nFound=1;

              for(i=0;i<nLen2;i++)

                     if(chString[nStartPos+i]!=chOldWord[i])

                     {

                            nFound=0;

                            break;

                     }

              if(nFound==1)/*相同,这Len2个字符需要被替换掉*/

              {

                     /*计算输入字串chString 的长度,注意在循环中每次计算chString

                     长度是必要的,因为完成一次替换后,chString的长度可能发生变化*/

                     while(chString[nLen1++]!='\0');

                     nLen1--;               

                     /*新词、旧词长度可能不同,先将chString长度调至正确的位置,

chStringnStartPos 后的字符可能需要前移或后移若干位*/

                     if(nLen3-nLen2>=0)/*新词比旧词长,从后向前移动*/

                     {

                            for(i=nLen1-1;i>=nStartPos;i--)

                                   chString[i+nLen3-nLen2]=chString[i];

                     }

                     else/*新词比旧词短,从前向后移动*/

                     {

                            for(i=nStartPos+nLen2;i<nLen1;i++)

                                   chString[i+nLen3-nLen2]=chString[i];

                     }

                     chString[nLen1+nLen3-nLen2]='\0';                  

                     /*将新词复制到chString,替换原来的旧词 */

                     for(i=0;i<nLen3;i++)

                            chString[nStartPos+i]=chNewWord[i];              

                     /*下一次检查的位置:从替换后新词后面的位置开始*/

nStartPos+=nLen3;

              }

              else/*不同,则从下一个字符开始,继续进行检查*/

                     nStartPos++;

       }

}

main()

{

       char chStr[MAXNUM],chOld[MAXNUM],chNew[MAXNUM];

       /*输入原始字符串、被替换串和替换串*/

       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",chStr);

}

分析

程序运行结果如下:

Please input the original string:

Tom want to go to school, Tom's father said...

Please input the word to be replaced:

Tom

Please input the new word to replace:

Jimmy

The processed string = Jimmy want to go to school, Jimmy's father said...

函数replace也可以使用递归函数实现,下面是使用递归和指针的一个例子(main函数可以不做改动)。

#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')

       {

              /*从当前位置开始查找,如果找到,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--;

                                   }           

                            }

                    

                     /*将新词复制到chString,替换原来的旧词*/

                     for(i=0;i<nLenNew;i++)

                            *pszString++=*(pszNewWord+i);              

                     break;

              }

              else/*找不到,继续下一个位置*/

                     pszString++;

       }

      

       /*在替换过的字符串中,递归替换下一个字符串*/

       if(*pszString)

              replace(pszString,pszOldWord,pszNewWord);    

}

posted @ 2011-07-29 23:07  又是一年夏天  阅读(265)  评论(0)    收藏  举报