A小小鸟 发表于 2019-2-22 14:49:04

C语言结构体的查找

小菜鸟,今天遇到一个难题,在一堆数据里面查找结构体,求大哥,能帮助我解决一下这个问题,{:5_111:} 具体题目见图片,5鱼币酬谢(系统只能给这么多,请不要不要嫌弃)

ba21 发表于 2019-2-22 14:56:38

{:10_319:}

行客 发表于 2019-2-22 15:39:23

你最好贴代码,要不然写数组就很麻烦

人造人 发表于 2019-2-22 16:02:15

这个问题不好解决,一般情况下是无解的
要解决这个问题就需要把这个问题特殊化

我随便选一个内存地址,从这个内存地址取两个dword值,第一个就认为是id,第2个就认为是level,你说行不行?
我随便选一个地址,就选 0
那么id就是 0x03020100,level就是 0x07060504,你说这对不对?
其实不用问,估计也不对

所以如果真的要从这些数据中查找,必须对id和level的取值进行限定
例如
id的取值只能是0和1
level的取值只能是10,11,12,13
这样就能搜索了,但是这还是有问题的,如果内存中正好有一个这样的数据

int index = 0;// 人物的索引,用这个索引访问一个数组可以得到更多人物的信息,这里正好是0
int age = 10    // 人物的年龄,这里正好是10岁
...                  // 这里是其他人物信息

这样用上面的搜索方法,就会误认为index和age为id和level


所以最好的方法就是找到这个程序是如何访问id和level这个数据的
我们完全可以模拟这个过程,用这种方法查找是最好的

人造人 发表于 2019-2-22 16:04:12

你的意思是id就只能为1,level就只能为8 ,是吗?

人造人 发表于 2019-2-22 16:12:49

#include <stdio.h>
#include <stdint.h>

typedef struct TagPlayer
{
        int id;
        int level;
} Player;

int *search(char *buf, size_t length)
{
        const Player player = {1, 8};
        for(size_t i = 0; i < length; ++i)
        {
                if(player.id == ((Player *)&buf)->id && player.level == ((Player *)&buf)->level)
                        return &buf;
        }
        return NULL;
}

int main(void)
{
        char buf;
        for(size_t i = 0; i < 100; ++i)
                buf = i;

        ((Player *)&buf)->id = 1;
        ((Player *)&buf)->level = 8;
        printf("%.8x\n", search(buf, 100));

        ((Player *)&buf)->id = 1;
        ((Player *)&buf)->level = 9;
        printf("%.8x\n", search(buf, 100));
        return 0;
}

012ff85c
00000000
请按任意键继续. . .

A小小鸟 发表于 2019-2-22 16:52:23

人造人 发表于 2019-2-22 16:04
你的意思是id就只能为1,level就只能为8 ,是吗?

嗯嗯,就是的,查找结构体id是1,level为8的,看看这对数据中有多少个这样的结构体,抱歉啊,下次,尽力将题目说明白

A小小鸟 发表于 2019-2-22 16:53:31

行客 发表于 2019-2-22 15:39
你最好贴代码,要不然写数组就很麻烦

不好意思,这是我的失误
数组的数据是
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,                                       
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,                                       
0x00,0x33,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x00,                                       
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,                                       
0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x08,0x00,0x00,                                       
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,                                       
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,                                       
0x00,0x02,0x57,0x4F,0x57,0x00,0x06,0x08,0x00,0x00,                                       
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,                                       
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00                               
};

A小小鸟 发表于 2019-2-22 16:55:10

ba21 发表于 2019-2-22 14:56


哈哈,你来了,为上次的事情向你道歉,系统原因,我食言了,对不起

A小小鸟 发表于 2019-2-22 16:56:40

本帖最后由 A小小鸟 于 2019-2-22 16:58 编辑

人造人 发表于 2019-2-22 16:12


谢谢你啊,辛苦了,就是代码最后返回的是查找了多少个这样的结构体,以及结构体的数据显示

人造人 发表于 2019-2-22 17:06:48

A小小鸟 发表于 2019-2-22 16:56
谢谢你啊,辛苦了,就是代码最后返回的是查找了多少个这样的结构体,以及结构体的数据显示

#include <stdio.h>
#include <stdint.h>

typedef struct TagPlayer
{
        int id;
        int level;
} Player;

size_t search(char *buf, size_t length)
{
        const Player player = {1, 8};
        size_t count = 0;
        for(size_t i = 0; i < length; ++i)
        {
                if(player.id == ((Player *)&buf)->id && player.level == ((Player *)&buf)->level)
                        ++count;
        }
        return count;
}

int main(void)
{
        char buf;
        for(size_t i = 0; i < 100; ++i)
                buf = i;

        ((Player *)&buf)->id = 1;
        ((Player *)&buf)->level = 8;

        ((Player *)&buf)->id = 1;
        ((Player *)&buf)->level = 8;

        ((Player *)&buf)->id = 1;
        ((Player *)&buf)->level = 8;

        ((Player *)&buf)->id = 1;
        ((Player *)&buf)->level = 8;

        ((Player *)&buf)->id = 1;
        ((Player *)&buf)->level = 8;

        ((Player *)&buf)->id = 1;
        ((Player *)&buf)->level = 8;

        printf("%.8x\n", search(buf, 100));
        return 0;
}


00000006
请按任意键继续. . .

jackz007 发表于 2019-2-22 17:31:42

本帖最后由 jackz007 于 2019-2-22 17:35 编辑

    根据要求,总共可以找出 1 个,位置在第 43 字节处。

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

main(void)
{
    union c2i {
      char c                                                   ;
      inti                                                   ;
    } * p                                                         ;
    char d[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,\
                0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,\
                0x00,0x33,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x00,\
                0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,\
                0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x08,0x00,0x00,\
                0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,\
                0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,\
                0x00,0x02,0x57,0x4F,0x57,0x00,0x06,0x08,0x00,0x00,\
                0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,\
                0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00 } ;
    int k , m , n                                                   ;
    m = 100                                                         ;
    k = 0                                                         ;
    n = 0                                                         ;
    while(k < m - 8) {
      p = (union c2i *) & d                                    ;
      if(p -> i == 1 && p -> i == 8) {
            n ++                                                    ;
            printf("%d : d[%d]\n" , n, k)                         ;
            k += 7                                                ;
      }
      k ++                                                      ;
    }
}

运行情况:
F:\\00.00.Exercise\C\Array>x
1 : d

F:\\00.00.Exercise\C\Array>

A小小鸟 发表于 2019-2-22 17:32:23

人造人 发表于 2019-2-22 17:06


真的谢谢你啊,你好厉害,我拜你为师了{:5_109:}

A小小鸟 发表于 2019-2-22 17:34:11

jackz007 发表于 2019-2-22 17:31
运行情况:
F:\\00.00.Exercise\C\Array>x
1 : d


谢谢你啊

人造人 发表于 2019-2-22 17:35:45

A小小鸟 发表于 2019-2-22 17:32
真的谢谢你啊,你好厉害,我拜你为师了

^_^
页: [1]
查看完整版本: C语言结构体的查找