strcat函数:
原型:extern char *strcat(char *strDest, char *strSrc);
功能:把strSrc所指字符串添加到strDest结尾处(覆盖strDest结尾处的'\0')并添加'\0';
说明:strSrc和strDest所指内存区域不可以重叠且strDest必须有足够的空间来容纳strSrc的字符串。
返回指向strDest的指针。
1 char *strcat(char *strDest, const char *strSrc)
2 {
3 char *address = strDest;
4 assert((strDest != NULL)&&(strSrc != NULL)); 对源地址和目的地址合法断言。
5 while (*strDest != '\0') //如果使用while (*strDest++),当strDest为空时,但此时strDest指向 空地址 的下一个地址。
6 {
7 strDest++;
8 }
9 while ((*strDest++ = *strSrc++) != '\0')
10 {
11 ;
12 }
13 return address;
14 }
大多数C语言里面的字符串都是 一个是字符数组参数,一个是字符指针参数。否则会发生错误
例如:
1 int main(void)
2 {
3 char *str1 = "I love ";
4 char *str2 = "China";
5 strcat(str1,str2);
6 printf("%s\n", str1);
7 return 0;
8 }
vc编译通过但运行失败。原因如下:
1 while ((*strDest++ = *strSrc++) != '\0')
2 {
3 ;
4 }
如果此时strDest是一个指针,这时*strDest就是取一个未知地址的值,系统是不允许的。当strDest是一个数组时就正确了,因为数组分配的是连续的地址。安全地址当然可以使用了。
真正的以指针为参数的字符串拼接函数:
1 char *strcat(char *strDest, char *strSrc)
2 {
3 assert((strDest != NULL) && (strSrc != NULL));
4 char *address = (char *)malloc((strlen(strDest) + strlen(strSrc) + 1)*sizeof(char));
5 char *tmp = address;
6 assert(address != NULL);
7 while (*strDest != '\0')
8 {
9 *address = *strDest;
10 strDest++;
11 address++;
12 }
13 while (*strSrc != '\0')
14 {
15 *address = *strSrc;
16 strSrc++;
17 address++;
18 }
19 *address = '\0';
20 return tmp;
21 }