《妙趣横生的算法》第10章 算法设计与数据结构面试精粹之常见的算法设计题10-5(question?)

     【例10-5】编写一个程序,将两个字符串连接,要求不破坏原有字符串。

     【分析】

      很容易想到,将两个字符串连接到一起,可以将一个字符串的头部连接到另一个字符串的尾部。然后返回前面的那个字符的首地址作为连接后字符串的首地址,该过程如下图所示。

    如上图所示,图(a)表示字符串s1,图(b)表示字符串s2,图(c)表示字符串s1和s2连接到一起,形成一个新的字符串。

   但是这样的解法并不符合题目的要求,因为题目中要求不破坏原有字符串,如果像上面介绍的方法进行字符串的连接操作,那么字符串s1和s2就都被破坏了。因此读者要审清题目

    正确的做法是另外开辟一个内存空间,它的长度为strlen(s1)+strlen(s2)+1(最后一个存储单元存放字符串结束标志)。然后将字符串s1和s2按照指定的顺序复制到新的内存空间中去。这样就形成了一个新的字符串,它的内容是原字符串s1和s2的内容连接在一起,同时也不破坏原有字符串,其算法描述如下:

char * cnnString(char *s1,char *s2)
{
    int len,len1,len2,i;
    char *s3;
    len1 = strlen(s1);
    len2 = strlen(s2);
    len = len1+len2+1;
    s3 = (char *)malloc(len);
    for(i=0;i<len1;i++)
        s3[i] = s1[i];      /*拷贝字符串s1*/
    for(i=0;i<len2;i++)
        s3[len1+i]=s2[i];   /*拷贝字符串s2*/
    s3[len-1]='\0';
    return s3;
}

    函数cnnString()实现将两个字符串s1和s2连接,将s2连接到s1的尾部,并返回连接后的字符串s3.

   (1)首先通过库函数strlen()计算字符串s1和s2的长度。

   (2)然后动态开辟一段内存空间,它的长度为strlen(s1)+strlen(s2)+1,并将这段内存空间的首地址赋值给指针变量s3,这样s3指向新的字符串。

     (3)然后通过两个循环语句分别将字符串s1好字符串s2顺序复制到字符串s3中。

     (4)最后将s3的最后一个存储单元赋值为'\0',作为字符串的结束标志。

      下面给出完整的测试程序,程序清单10-5

#include "stdio.h"
char * cnnString(char *s1,char *s2)
{
    int len,len1,len2,i;
    char *s3;
    len1 = strlen(s1);
    len2 = strlen(s2);
    len = len1+len2+1;
    s3 = (char *)malloc(len);
    for(i=0;i<len1;i++)
        s3[i] = s1[i];      /*拷贝字符串s1*/
    for(i=0;i<len2;i++)
        s3[len1+i]=s2[i];   /*拷贝字符串s2*/
    s3[len-1]='\0';
    return s3;
}
main()
{
    char s1[]="This is a test ";
    char s2[]="for connecting two string.";
    printf("%s\n",s1);   /*输出字符串s1*/
    printf("%s\n",s2);   /*输出字符串s2*/
    printf("%s\n",cnnString(s1,s2)); /*输出连接后的字符串s3*/
    getche();
}
   本程序的运行结果如下所示

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值