【例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();
}
本程序的运行结果如下所示