366

帖子

1

TA的资源

一粒金砂(高级)

21
 

strlen函数的源码如下:
  1. size_t (strlen)(const char *s)
  2.         {        /* find length of s[] */
  3.         const char *sc;
  4.         for (sc = s; *sc != '\0'; ++sc);
  5.         return (sc - s);
  6. }
复制代码

实现方法是判断‘\0’的位置,也就是0x00的位置,所以我想可以先把a复制到b,然后通过不断调用strlen来找到0x00的位置,然后删除掉0x00,但是我暂时没想到如何终止判断,而且似乎不断调用strlen这一过程还是会用到循环,另外找到一个0x00之后,要删除的话我暂时能想到的办法就是把后面的数据往前移,或者是把0x00后面的内容作为字符串copy到0x00的位置,但是这样同样无法避免找到a中最后一个0x00之后,无法中止循环,还是会继续往后面去找,除非已知a数组的长度
此帖出自编程基础论坛
 

回复

366

帖子

1

TA的资源

一粒金砂(高级)

22
 
飞翔荷兰人号 发表于 2017-9-26 23:33
strlen函数的源码如下:
[code]size_t (strlen)(const char *s)
        {        /* find length of s ...

看了下新帖里的一个回复,突然明白了,可以用sizeof获取原数组的长度,这样就不用考虑最后一个0x00找到之后还继续往后找的情况了,唉,这都想不到
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

23
 
飞翔荷兰人号 发表于 2017-9-26 23:38
看了下新帖里的一个回复,突然明白了,可以用sizeof获取原数组的长度,这样就不用考虑最后一个0x00找到之 ...

额,弱弱表示一下,sizeof不失为一个很聪明的方法。
但是,对于以地址形式传递数组的时候。
这招就失效了。

所以这个有失效的风险。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

366

帖子

1

TA的资源

一粒金砂(高级)

24
 
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void data_cleaning(unsigned char* data, int length ){

  4.     unsigned char* abc = data;
  5.     int total_length = length;
  6.     int i = 0;
  7.     int temp_length = 0;
  8.     int j = 0;

  9.     for(i=0; i<=total_length; i+=temp_length ){
  10.         temp_length = strlen(abc);

  11.         for(j=0; j<temp_length; j++) {
  12.             printf("%2x ", abc[j]);
  13.         }

  14.         temp_length = strlen(abc)+1;
  15.         abc += temp_length;

  16.     }
  17. }

  18. int main(){

  19.     int m = 0;
  20.     unsigned char a[] = {0x00,0xAC,0x33,0x64,0x14,0xAB,0x00,0x80,0x64,0x14,0xAB,0x00,0x5C,0x64,0x14,0xAB,0x00,0x5C,0x00,0x55};

  21.     for(m=0; m<19; m++) {
  22.         printf("%2x ", a[m]);
  23.     }
  24.     printf("\n");

  25.     data_cleaning( a, sizeof(a) );

  26.     return 0;
  27. }
复制代码


专门在数组的头和尾部加了0x00,检验下边界值

QQ截图20170927004301.png (17.21 KB, 下载次数: 0)

QQ截图20170927004301.png
此帖出自编程基础论坛
 
 
 

回复

366

帖子

1

TA的资源

一粒金砂(高级)

25
 
辛昕 发表于 2017-9-26 23:52
额,弱弱表示一下,sizeof不失为一个很聪明的方法。
但是,对于以地址形式传递数组的时候。
这招就失效 ...

用sizeof把最初的数组长度测出来,作为参数一起传给处理函数,这样函数就知道自己要处理的范围,就不会失效了
此帖出自编程基础论坛
 
 
 

回复

6040

帖子

205

TA的资源

版主

26
 
飞翔荷兰人号 发表于 2017-9-27 00:44
[code]#include
#include

void data_cleaning(unsigned char* data, int length ){

...

你自己也看到了,输出结果是不正确的,结尾多了些内容,而这些内容就是你数组越界访问到的,strlen要求参数以0作为约定的结尾,然而这个数组的末尾并不能保证是0,所以最后一次求值就是不正确的。
此帖出自编程基础论坛
 
 
 

回复

366

帖子

1

TA的资源

一粒金砂(高级)

27
 
lcofjp 发表于 2017-9-27 01:30
你自己也看到了,输出结果是不正确的,结尾多了些内容,而这些内容就是你数组越界访问到的,strlen要求参 ...

恩恩,必须结合原数组的总长度做越界判断
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表