首先看看代碼:html
1 #ifndef STRCAT_H 2 #define STRCAT_H 3 4 /******************************************************************* 5 原型:extern char *strcat(char *dest,char *src); 6 7 strcat() 會將參數 src 字符串複製到參數 dest 所指的字符串尾部; 8 dest最後的結束字符NULL會被覆蓋掉,並在鏈接後的字符串的尾部再增長一個 NULL。 9 10 返回指向dest的指針。 11 12 注意:dest 與 src 所指的內存空間不能重疊, 13 且 dest 要有足夠的空間來容納要複製的字符串。 14 15 ******************************************************************* 16 拓展: 17 * 有兩個意思,理論上 18 做爲 乘法 運算符,級別低於 ++(自增)。 19 做爲 指針取值 運算符,級別同 ++(自增)同樣。 20 21 *p++; 很使人混淆。它不是 *p = *p + 1; 而是 *p = *(p+1); 22 *******************************************************************/ 23 24 #include <stdio.h> 25 26 char *cat_stacat(char *dst, const char *src) { 27 if (NULL == dst && NULL == src) 28 return NULL; 29 30 char *addr = dst; 31 32 // 方法1: 33 // Notice: 注意方法1和2的區別!方法1的話,最後一次循環dst加了1,最終指向字符串結束符'\0'的下一字節
// 若是不--dst。則最後多是「hello\0world」,遇到\0就結束,因此只會輸出hello
34 /*while (*dst++) ; 35 --dst;*/ 36 37 // 方法2: 38 while (*dst) 39 ++dst; 40 41 while (*dst++ = *src++) ; 42 43 *dst = '\0'; // 44 45 46 return addr; // 返回指向dst的指針 47 } 48 49 50 #endif
main:c++
1 #include "strcat.h" 2 3 void test_strcat(); 4 5 int main() { 6 7 test_strcat(); 8 9 return 0; 10 } 11 12 void test_strcat() { 13 char dst[64] = { "hello" }; // 保證dst有足夠的空間 14 15 char *ret = cat_stacat(dst, " world!"); 16 17 printf("%s\n%s\n", ret, dst); 18 }
注意!!!小程序
1 // 方法1: 2 // Notice: 注意方法1和2的區別!方法1的話,最後一次循環dst加了1,最終指向字符串結束符'\0'的下一字節 3 while (*dst++) ; 4 --dst; 5 6 // 方法2: 7 while (*dst) 8 ++dst;
注意這2種寫法的區別!!!函數
讓我看看while(*p++ !=‘\0’)的祕密。原覺得跳出後,p指向'\0',而實際上並不是如此!這樣子怎麼拼接都實現不了。爲了驗證這個問題,咱們先上個小程序吧:spa
1 #include<stdio.h> 2 3 void main() 4 5 { 6 7 char *p = "abcdefg"; 8 9 while(*p++ != 'c'); 10 11 printf("%c\n", *p); 12 13 }
您猜打印出來的是幾? 結果是d。.net
爲何呢?指針
原來*和++的優先級是同樣的,當優先級同樣的時候,程序按自左至右的順序執行。因此當*p = 'c' 或者*p = '\0'時,p仍然要往下移一位,即p指向知足條件後的下一個字節。(cat_strcat函數代碼中的最後一次循環dst加了1,最終指向字符串結束符'\0'的下一字節)code
因爲'\0' 結束符,if 、while當會把他判成0,所以程序寫成while(*p++ );效果也同樣,最終程序指向字符串結束符'\0'的下一字節。htm
若是這樣寫:blog
while(*p) p++;
當*p='\0'時,進不到while裏面的循環,所以這種寫法跳出循環的時候,p指向的是'\0'。同志們注意了,這樣寫while後面是沒有「;」號的。
//===========================================================//
最後,main函數輸出的ret和dst的字符串是同樣的!!
既然同樣,爲何還須要返回那個值呢?豈不是畫蛇添足?
緣由其實很簡單,咱們寫c代碼的時候,常會用到鏈式調用。
即:經過返回首地址能夠實現像strcat(strcat(dst, str1), str2);同樣的用法!!!
在前面實現strcpy的博文中也說到了這點:http://www.cnblogs.com/lingshaohu/p/3961132.html
參考:http://blog.csdn.net/yanzi1225627/article/details/7843672