我们都知道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()有一个不可或缺的优势,是能够自由的控制要增加的字符;

©著作权归作者所有:来自51CTO博客作者狐狸花哨的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 判断字符串是否为空变量
  2. 这样规范写代码,同事直呼“666”
  3. PHP基础:字符串函数的作用和练习
  4. 常用的字符串方法介绍以及使用事件代理实现一个简单的留言板
  5. 20个基础函数的练习
  6. php字符串函数解析
  7. KMP算法的JAVA实现
  8. 深入探索Redis的五种基础数据类型
  9. [牛客习题]逆置字符串

随机推荐

  1. 自学Python九 爬虫实战二(美图福利)
  2. ubuntu使用uwsgi+nginx部署django
  3. python学习笔记:python 2与python 3的一些
  4. 【python学习.油价和美元汇率查询】
  5. python---写一个迭代器
  6. 第七章、Python字符编码
  7. python中x,y交换值的问题
  8. Django rest framework 使用自定义认证方
  9. Python学习/复习神器-->各种方法/技巧在哪
  10. Python:Sympy定义与包含变量的边界的积分