1. 程式人生 > 其它 >strcat和strncat的區別及原理

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()有一個不可或缺的優勢,是能夠自由的控制要增加的字元;