打印
[技术讨论]

关于数组元素查找的问题不是很理解

[复制链接]
690|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
畅想天子|  楼主 | 2022-4-11 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个是源程序,从100个数据中找出 + O K \r \n 这五个元素
static u8 wait_for_wifi_ok(void)
{
    u16 i,search;
    for(i=0; i<100; i++)
    {
        for (search=4; search<100; search++)
        {
            if(Wifi_Data_Recv_Buf[search] =='\n')
            {
                if(Wifi_Data_Recv_Buf[(search-1)] =='\r')
                {
                    if(Wifi_Data_Recv_Buf[(search-2)] =='K')
                    {
                        if(Wifi_Data_Recv_Buf[(search-3)] =='O')
                        {
                            if(Wifi_Data_Recv_Buf[(search-4)] =='+')
                            {
                                 return 1;
                            }
                        }
                    }
                }
            }
        }
  
    }
        return 0;
}
这个是我自己理解的程序,和上面的源程序等效吗?请高手指点
static u8 wait_for_wifi_ok(void)
{
    u16 i,search;
    for(i=0; i<100; i++)
    {
        for (search=4; search<100; search++)
        {
            if(Wifi_Data_Recv_Buf[search-4] =='\n')
            {
                if(Wifi_Data_Recv_Buf[(search-3)] =='\r')
                {
                    if(Wifi_Data_Recv_Buf[(search-2)] =='K')
                    {
                        if(Wifi_Data_Recv_Buf[(search-1)] =='O')
                        {
                            if(Wifi_Data_Recv_Buf[(search)] =='+')
                            {
                                 return 1;
                            }
                        }
                    }
                }
            }
        }
      
    }
        return 0;
}

使用特权

评论回复
评论
tyw 2022-4-11 10:50 回复TA
去油香收 

相关帖子

沙发
sjnh| | 2022-4-11 10:57 | 只看该作者
肯定不等效,你的是字符串反的,另外考虑用strstr,这是C的标准函数

使用特权

评论回复
板凳
xch| | 2022-4-11 11:35 | 只看该作者
程序员与打字员的差距相当大。吓死程序员了。

使用特权

评论回复
地板
畅想天子|  楼主 | 2022-4-11 11:38 | 只看该作者
sjnh 发表于 2022-4-11 10:57
肯定不等效,你的是字符串反的,另外考虑用strstr,这是C的标准函数

谢谢,已经解决了

使用特权

评论回复
5
畅想天子|  楼主 | 2022-4-11 11:43 | 只看该作者
本帖最后由 畅想天子 于 2022-4-11 11:52 编辑

刚才认真理了一下应该是这样的,这种查找是最简单的顺序查找,但是很浪费时间,还有没有更省时间的查找方法,欢迎大家来探讨.......
static u8 wait_for_wifi_ok(void)
{
    u16 i,search;
    for(i=0; i<100; i++)//循环100次
    {
        for (search=4; search<100; search++)//查找这五个元素 + 0 K \r \n
        {
            if(Wifi_Data_Recv_Buf[search] =='\n')// \n至少是数组中的第五个数。数组从0开始,所以search=4
            {
                if(Wifi_Data_Recv_Buf[(search-1)] =='\r')//\r至少是数组中的第四个数。数组从0开始,所以search-1=3
                {
                    if(Wifi_Data_Recv_Buf[(search-2)] =='K')//K至少是数组中的第三个数。数组从0开始,所以search-2=2

                    {
                        if(Wifi_Data_Recv_Buf[(search-3)] =='O')//0至少是数组中的第四个数。数组从0开始,所以search-3=1
                        {
                            if(Wifi_Data_Recv_Buf[(search-4)] =='+')//+至少是数组中的第五个数。数组从0开始,所以search-4=0
                            {
                                 return 1;//全部找到返回1
                            }
                        }
                    }
                }
            }
        }
        msWaitForTask(100);//等待
    }
        return 0;//100次循环后返回0
}

使用特权

评论回复
6
天意无罪| | 2022-4-11 11:51 | 只看该作者
源程序是方向查找,所以search变量从4开始,而你的程序是想正向查找,那么search变量应该从0开始。

使用特权

评论回复
7
xch| | 2022-4-11 17:59 | 只看该作者
本帖最后由 xch 于 2022-4-11 18:09 编辑
畅想天子 发表于 2022-4-11 11:43
刚才认真理了一下应该是这样的,这种查找是最简单的顺序查找,但是很浪费时间,还有没有更省时间的查找方法 ...

strcmp
参考它后改一改。

使用特权

评论回复
8
xch| | 2022-4-11 18:06 | 只看该作者
本帖最后由 xch 于 2022-4-11 18:29 编辑

char s1[]={"+OK\r\n"};

static int8_t mystrcmp(char *s1,char *s2,uint16_t size)
{
  while(size)
  {
    if(*s1++ != *s2++) return 1;
  }
  return 0;
}
static uint8_t wait_for_wifi_ok(void)
{
  for (int16_t i=0;i<100;i++)
  {
    for(int16_t search=0;search<100-3;search++ )
    {
      if ( 0== mystrcmp(s1 ,&Wifi_Data_Recv_Buf[search],5) ) return 1;
    }
    msWaitForTask(100);//等待
  }
  return 0;
}

使用特权

评论回复
9
畅想天子|  楼主 | 2022-4-12 09:23 | 只看该作者
xch 发表于 2022-4-11 18:06
char s1[]={"+OK\r\n"};

static int8_t mystrcmp(char *s1,char *s2,uint16_t size)

非常感谢,这是一个很棒的思路,基本上没有问题,经过稍微修改,运行很好
static int8_t mystrcmp(char *s1,char *s2,uint16_t size)
{
  while(size)
  {
    if(*s1++ != *s2++) return 1;
                size--;//加上这条语句,运行很完美
  }
  return 0;
}
static u8 wait_for_wifi_ok(void)
{
  u16 i,search;
        for (i=0;i<100;i++)
  {
    for(search=0;search<100;search++)
    {
      if (mystrcmp(s1 ,&Wifi_Data_Recv_Buf[search],5)==0)
                        {return 1;}
    }
    msWaitForTask(100);//等待
  }
  return 0;
}

使用特权

评论回复
10
xch| | 2022-4-12 19:14 | 只看该作者
畅想天子 发表于 2022-4-12 09:23
非常感谢,这是一个很棒的思路,基本上没有问题,经过稍微修改,运行很好
static int8_t mystrcmp(char * ...

漏了”--“

不好意思

使用特权

评论回复
11
畅想天子|  楼主 | 2022-4-13 08:06 | 只看该作者
xch 发表于 2022-4-12 19:14
漏了”--“

不好意思

没关系,这已经足够了。谢谢你

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

331

帖子

2

粉丝