strcat和strncat的區別及原理
技術標籤:C語言
我們都知道strcat和strncat都是在一個字串後追加字元的函式,那t它們有什麼區別呢?它們又是什麼原理呢?
首先要了解二者的原理才能夠區分它們有什麼樣的區別;
strcat的用法——呼叫strcat函式,傳兩個字串陣列過去或者一個字串陣列和一個字串,需要呼叫string.h標頭檔案;
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所指向的元素交換;
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()方便之處在於只用傳兩個引數可以實現,比較簡便;
但建議時採用strncat(),因為不會出現上述的陷入死迴圈的可能,頂多是多算一步長度(strlen(陣列名)),並且strncat()有一個不可或缺的優勢,是能夠自由的控制要增加的字元;