关于strncat 和strcat使用时的一个小细节对比

今天在测试strcat  与strncat的用法时,发现了一个问题。在看一个mqtt工程的源代码时,看到了这样的写法:

mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(devid_len);
mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(devid_len);

strncat((int8 *)mqttPacket->_data + mqttPacket->_len, devid, devid_len);


当时查了一下strncat的用法:


当时比较在意说明那一块所指的src和dest内存区域不可以重叠,然后结合上面的工程源码猜想,难道是为了避免产生src和dest内存区域重叠这样的问题,所以在

在后面stcncat的时候把地址往后推了两个字节么?然后怀着这样的想法在VC上试了一下:

#include<stdio.h>
#include<string.h>
#include<malloc.h>

char* buff1;
//char buff[] = "12345";
char* buff2 = "abcdf";

int main(void)
{
int i;
buff1 = malloc(10);
for(i=0;i<10;i++)
{
buff1[i]=0;
}
if(NULL==buff1) return -1;
buff1[0] = 49;
buff1[1] = 50;

strncat((char*)buff1,buff2,6);
printf("%s\n",buff1);
free(buff1);
buff1 = NULL;
return 0;
}

结果上图的在没有将buff1后移的情况下,buff2的字符串内容还是能成功的追加到buff1后面的。然后又回过头了看了对stcncat的描述:



那么是否可以理解,src认定的结尾就是‘\0’,但是想想写这个工程源码的肯定也是一位大牛了,这样的写法肯定是有原因的吧?目前个人认为即使在

功能性上来说,是否将dest的地址后移对结果并无影响,但是这样的写法可以让读者阅读起来更加容易理解上下文。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值