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 }
