如何比较2个数组的值是否相等?

rejoice818 2013-08-24 09:13:09
STATIC UINT8 Key1val[6]={0xA5,0x5A,0x04,0xB1,0xB5,0xAA};//按键1
STATIC UINT8 Key2val[6]={0xA5,0x5A,0x04,0xB2,0xB6,0xAA};//按键2
STATIC UINT8 Key3val[6]={0xA5,0x5A,0x04,0xB3,0xB7,0xAA};//按键3

keil C中,下面三个数组为app发过来的按键键值,开始定义一个数组buf[6]={0};然后把实际接收到的键值保存到buf[]中,再与下面3个数组(键值)比较,思路是怎样的?用for一个个数组一个个值比较吗?buf[i]赋值后]可以直接这样吗?在已知道sizeof Key1val = sizeof buf =6的条件下,这样比较可以吗?求大虾指教,或者用指针都ok的。
for(i=0;i<sizeof buf;i++)
{
if(buf[i]==Key1val[i])
}


...全文
7309 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
躺着睡的蜗牛 2013-08-27
  • 打赏
  • 举报
回复
先判断最前面三个字节和最后一个数据,如果不同,直接返回。这样在数据出错的情况下能最快检测到。 再把第四个字节和第五个字节合成一个short型,用switch来判断并且添加相关处理。
rocktyt 2013-08-26
  • 打赏
  • 举报
回复
引用 4 楼 my_live_123 的回复:
如果不是char类型,那么自己一个一个比较吧,因为从其源码上看,它也是这么干的。而如果lz是非char类型,比如int类型,它转换成char后反而增加了循环次数。

int memcmp(const void *cs, const void *ct, size_t count)
652 {
653         const unsigned char *su1, *su2;
654         int res = 0;
655 
656         for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
657                 if ((res = *su1 - *su2) != 0)
658                         break;
659         return res;
660 }
memcmp一般编译器会优化的,实际一般不会这么跑(debug模式可能会这样,release模式肯定不会)
赵4老师 2013-08-26
  • 打赏
  • 举报
回复
用__int64存储,用switch语句
chengmax 2013-08-25
  • 打赏
  • 举报
回复
STATIC  UINT8 Key1val[6]={0xA5,0x5A,0x04,0xB1,0xB5,0xAA};//按键1
STATIC  UINT8 Key2val[6]={0xA5,0x5A,0x04,0xB2,0xB6,0xAA};//按键2
STATIC  UINT8 Key3val[6]={0xA5,0x5A,0x04,0xB3,0xB7,0xAA};//按键3

你app发过来的按键键值有多少个?都是6个字节的吗? 按你上面说的,按键1、2、3,这个数组是有规律的,就第5个字节不一样。 如果确定app发过来的就是按键键值,可以直接判断第5个字节。 ,懒人的办法。
lxmuyu 2013-08-25
  • 打赏
  • 举报
回复
直接把三个数组按某种方式对应到3个不同的数,对于传入的数组,求出数再与先前的三个数对比下就可以哪
大尾巴猫 2013-08-25
  • 打赏
  • 举报
回复
就用for循环,数组下标的方式逐个比较。 效率一点都不会差。
一根烂笔头 2013-08-24
  • 打赏
  • 举报
回复
如果不是char类型,那么自己一个一个比较吧,因为从其源码上看,它也是这么干的。而如果lz是非char类型,比如int类型,它转换成char后反而增加了循环次数。

int memcmp(const void *cs, const void *ct, size_t count)
652 {
653         const unsigned char *su1, *su2;
654         int res = 0;
655 
656         for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
657                 if ((res = *su1 - *su2) != 0)
658                         break;
659         return res;
660 }
rejoice818 2013-08-24
  • 打赏
  • 举报
回复
我也刚找到了 memcmp(const void *s1,const void *s2,len)与 strncmp(const char *s1,const char *s2,len); 两个函数,谢谢楼上两位,我先试试。
cao_julians 2013-08-24
  • 打赏
  • 举报
回复
数组中元素间如果没有空隙(由于字节对齐产生的空隙),就可以用户memcpy.对结构数组,由于成员的类型不同,字节对齐产生的空隙存在,就不能用memcpy
AnYidan 2013-08-24
  • 打赏
  • 举报
回复
引用 9 楼 rejoice818 的回复:
嗯嗯 谢谢大家,数组里面的元素不多,可以一个个比,不过我就是考虑到如果多的话应该有更好的解决办法,而数组和一般变量比较不一样,所以特别请教下大家,很久没来这里发提问帖了,还是一如既往的能学到东西,解决问题,感谢大家! 用memcmp(buf, Key1val, sizeof(buf));解决了
如果多的话应该先比数组长度
mymtom 2013-08-24
  • 打赏
  • 举报
回复
一个一个比较是可以的, 也可以用memcmp memcmp(buf, Key1val, sizeof(buf));
rejoice818 2013-08-24
  • 打赏
  • 举报
回复
嗯嗯 谢谢大家,数组里面的元素不多,可以一个个比,不过我就是考虑到如果多的话应该有更好的解决办法,而数组和一般变量比较不一样,所以特别请教下大家,很久没来这里发提问帖了,还是一如既往的能学到东西,解决问题,感谢大家! 用memcmp(buf, Key1val, sizeof(buf));解决了
max_min_ 2013-08-24
  • 打赏
  • 举报
回复
如果数组量不是很多的话,单个比较也没有效率高低之说!
lin5161678 2013-08-24
  • 打赏
  • 举报
回复
引用 2 楼 cao_julians 的回复:
数组中元素间如果没有空隙(由于字节对齐产生的空隙),就可以用户memcpy.对结构数组,由于成员的类型不同,字节对齐产生的空隙存在,就不能用memcpy
也不是不能 先menset(.. 0 ..) 写入数据 比较的时候 就可以用mencpy
qq120848369 2013-08-24
  • 打赏
  • 举报
回复
使用memcmp,使用strcmp/strncmp是错的。
Digital00 2013-08-24
  • 打赏
  • 举报
回复
数组有数组的一类已经定义好的函数,你搜一下学习学习

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧