那些年嵌入式开发c&c++入的坑号004

坑位描述:把含十进制0的有效数据当成字符串处理导致数据被截断造成不完整
strcpy strncpy memcpy
三者区别:
void *memcpy(void *s2, const void *s1, size_t n);
char *strcpy(char *s2, const char *s1);
char *strncpy(char *s2, const char *s1, size_t n);
strcpy 是依据 ‘\0’ 作为结束判断的,如果 s2 的空间不够,则会引起 buffer overflow。
memcpy用来在内存中复制数据,由于字符串是以“\0”结尾的,所以对于在数据中包含“\0”的数据只能用memcpy,如:“hello\0world”。
strncpy和memcpy很相似,只不过它在一个终止的空字符处停止。当n>strlen(s1)时,给s2不够数的空间里填充“\0”;当n<=strlen(s1)时,s2是没有结束符“\0”的。

入坑场景:
平台下发时间(6字节:09 08 07 00 05 04)给设备,设备用strncpy把时间复制出来保存,但是因为时间字符串中带有00,导致只复制09 08 07,后面的没复制到。导致时间对不上。

请记住尽量用memcpy,当然使用时要注意目标地址的大小,别越界了。
假设pDst和pSrc为字符数组首地址,复制的时候
memcpy(pDst,pSrc,min(sizeof(pDst),sizeof(pSrc)))

知识补充:
‘\0’: 是指转义一个十进制值0,变成ascii字符,所以’\0’的ascii码值就是0,所以和十进制0没什么区别。所以给char数组赋值0后就相当于字符串结束符了。
例如:

char szData[5]={0};
szData[0]='a';
szData[1]=0;//字符串已结束,后面的字符将被截断;
szData[2]='c';
szData[3]='\0';
printf("szData=%s\n",szData);//打印结果是“a”
szData[1]='b';
printf("szData=%s\n",szData);//打印结果是“abc”

C/C++ 中‘0’ “0” ‘\0’ 0的辨析:
‘0’ 0对应的ASCII码,其值为48
“0” 字符串常量。双引号括起来的都属于字符串
‘\0’ 空字符(NULL)对应的ASCII码为0,即‘\0’=NULL
0 数字

有很多情况字符串中就是带有有效数值0的,如果日期20200521,如加密算法结果可能带有0的一串数字,那么针对该种情况,不得对char数组或者指针进行string赋值或者字符串操作,而是需要通过访问内存方式进行数据处理,确保每一个数据都被处理到。

写在尾部:
大家多总结,多分享,做事更高效,生活更美好,人生才会更有意义!总结了很多没有分享那没有多大意义。为此,捡起多年不更新的公众号,打算当成一个记录手册,把自己的技术所得,生活感悟和人生所获积极正能量,有意义的事记录下来,有兴趣的朋友可以关注我的公众号,一起做交流学习。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值