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

相关文章
相关标签/搜索