咱們都知道strcat和strncat都是在一個字符串後追加字符的函數,那t它們有什麼區別呢?它們又是什麼原理呢?數組
首先要了解兩者的原理纔可以區分它們有什麼樣的區別;
strcat的用法——調用strcat函數,傳兩個字符串數組過去或者一個字符串數組和一個字符串,須要調用string.h頭文件;ide
char arr1[30] = "abcd"; char arr2[] = "efd"; strcat(arr1, arr2); ---------------------- strcat (str,"concatenated.")
其源碼爲(我本身實現的,會與真正的源碼有所不一樣,可是原理是相同的)
第一步:把被增長字符串的指針指向該字符串的'\0'處
第二步:將增長字符串與被增長字符串的‘\0’交換
第三步:將str的最後一位置爲'\0'函數
void strcat(char* str, const char* d) { while (*str) str++; while (*d != '\0') { *str = *d; str++; d++; } str++; *str = '\0'; } int main() { char arr1[30] = "abcd"; char arr2[] = "efd"; strcat(arr1, arr2); printf("%s\n", arr1); return 0; }
strncat的用法——調用strncat函數,傳兩個字符串以及整型值,整型值表示的要追加的字符個數,須要調用string.h頭文件;指針
char str1[20] = "abcde"; char str2[20] = "cdefad"; strncat (str1, str2, 6);
源碼:
第一步:先把arr1的指針移到'\0'處
第二步:把arr2所指向的元素與arr1所指向的元素交換;code
void my_strncat(char* arr1, char* arr2, int len) { assert(arr1); assert(arr2); arr1 = arr1 + len; while (len-- != 0) { //第一步:先把arr1的指針移到'\0'處 //第二步:把arr2所指向的元素與arr1所指向的元素交換; *arr1 = *arr2; arr1++; arr2++; } } int main() { char arr1[30] = "abcdeef"; int len = strlen(arr1); my_strncat(arr1, arr1, len); printf("%s\n", arr1); return 0; }
能夠清楚地看到兩者的傳參不一致,但實現的效果倒是相同的,兩者最主要的區別是strcat()的增長字符串的結束條件是str2 == '\0'(str2爲要添加的字符串);strncat的循環結束的條件則是所要追加的字符串個數len爲0;字符串
那麼爲何要有兩個實現效果同樣的函數出現呢?
看起來兩者的實現效果是同樣的,可是若是是要在本來字符串的基礎上增長本來字符串,那麼只能使用strncat函數了;源碼
char arr1[30] = "abcd"; strcat(arr1, arr1);
由於strcat本質上是把被增長的字符串的'\0'與增長字符串的元素交換實現的,那麼當增長的是本身的時候,'\0'會和前面的元素交換,當所有交換完畢以後會發現'\0'又跑到後面去了,這樣終止條件便再也不成立,會陷入到死循環當中;strcat()方便之處在於只用傳兩個參數能夠實現,比較簡便;string
但建議時採用strncat(),由於不會出現上述的陷入死循環的可能,頂可能是多算一步長度(strlen(數組名)),而且strncat()有一個不可或缺的優點,是可以自由的控制要增長的字符;it