strcat和strncat的區別及原理

咱們都知道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

相關文章
相關標籤/搜索