数据要求
问题中的常量:
#define MAXNUM 200 /*定义数组的最大长度*/
问题的输入:
char chStr /*字符串1,初始的字符串*/
char chOld /*字符串2,要寻的旧的字符串/
char chNew /*字符串3,要替换的新的字符串/
问题的输出:
char str1 /*字符串1,最终输出的结果字符串,是替换后的字符串*/
初始算法
1.定义三个字符串;
2.调用库函数初始化三个字符串;
3.调用函数replace得到最终的字符串;
4.输出结果字符串;
5.结束。
算法细化
算法的主要步骤是第三步,它完成了旧字符串的查定位和新字符串的替换的功能,具体的步骤细化如下:
步骤3的细化
    3.1 初始化临时变量
    3.2 循环计算字符串2(也就是旧的字符串)的长度   
    3.3 循环计算字符串3(也就是新的字符串)的长度
3.4 循环查字符串2是否在字符串1中,如果到,用字符串3(chNew)替换掉字符串2(chOld)
3.5 函数结束
对一次替换的算法,可以分解为3个步骤:查、调整长度和替换。
查:查字符串1中是否有字符串2。利用循环可以得到字符串2的长度nLen2。从字符串1的第一个元素开始,比较后面的nLen2个元素是否和字符串2的nLen2个元素完全相同。如果完全相同,则进行步骤2;否则从字符串1的第二个元素开始,继续上述过程… …。如果搜索到字符串末尾也不能进行步骤2,则说明字符串1中没有字符串2。
调整长度:计算替换后的字符串1长度,调整字符串1。假设字符串1的位置nStartPos后的nL
en2个元素与字符串2相同。如果字符串3的长度nLen3大于字符串2的长度nLen2,那么字符串1的位置nStartPos+nLen2后的所有元素向后移动nLen3–nLen2位;否则,向前移动nLen2–nLen3位。这样处理后,字符串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长度调至正确的位置,
chString中nStartPos 后的字符可能需要前移或后移若干位*/
            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
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
函数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)/*到了,进行替换*/
单个字符视为长度为1的字符串        {
            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);   
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。