鱼C论坛

 找回密码
 立即注册
查看: 1827|回复: 14

[已解决]C语言结构体的查找

[复制链接]
发表于 2019-2-22 14:49:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小菜鸟,今天遇到一个难题,在一堆数据里面查找结构体,求大哥,能帮助我解决一下这个问题, 具体题目见图片,5鱼币酬谢(系统只能给这么多,请不要不要嫌弃)
最佳答案
2019-2-22 17:06:48
A小小鸟 发表于 2019-2-22 16:56
谢谢你啊,辛苦了,就是代码最后返回的是查找了多少个这样的结构体,以及结构体的数据显示
  1. #include <stdio.h>
  2. #include <stdint.h>

  3. typedef struct TagPlayer
  4. {
  5.         int id;
  6.         int level;
  7. } Player;

  8. size_t search(char *buf, size_t length)
  9. {
  10.         const Player player = {1, 8};
  11.         size_t count = 0;
  12.         for(size_t i = 0; i < length; ++i)
  13.         {
  14.                 if(player.id == ((Player *)&buf[i])->id && player.level == ((Player *)&buf[i])->level)
  15.                         ++count;
  16.         }
  17.         return count;
  18. }

  19. int main(void)
  20. {
  21.         char buf[100];
  22.         for(size_t i = 0; i < 100; ++i)
  23.                 buf[i] = i;

  24.         ((Player *)&buf[12])->id = 1;
  25.         ((Player *)&buf[12])->level = 8;

  26.         ((Player *)&buf[24])->id = 1;
  27.         ((Player *)&buf[24])->level = 8;

  28.         ((Player *)&buf[32])->id = 1;
  29.         ((Player *)&buf[32])->level = 8;

  30.         ((Player *)&buf[45])->id = 1;
  31.         ((Player *)&buf[45])->level = 8;

  32.         ((Player *)&buf[67])->id = 1;
  33.         ((Player *)&buf[67])->level = 8;

  34.         ((Player *)&buf[87])->id = 1;
  35.         ((Player *)&buf[87])->level = 8;

  36.         printf("%.8x\n", search(buf, 100));
  37.         return 0;
  38. }
复制代码

  1. 00000006
  2. 请按任意键继续. . .
复制代码
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-22 14:56:38 | 显示全部楼层

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
A小小鸟 + 5 + 5 + 3 谢谢你啊

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-22 15:39:23 | 显示全部楼层
你最好贴代码,要不然写数组就很麻烦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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这个数据的
我们完全可以模拟这个过程,用这种方法查找是最好的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-22 16:04:12 | 显示全部楼层
你的意思是id就只能为1,level就只能为8 ,是吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-22 16:12:49 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdint.h>

  3. typedef struct TagPlayer
  4. {
  5.         int id;
  6.         int level;
  7. } Player;

  8. int *search(char *buf, size_t length)
  9. {
  10.         const Player player = {1, 8};
  11.         for(size_t i = 0; i < length; ++i)
  12.         {
  13.                 if(player.id == ((Player *)&buf[i])->id && player.level == ((Player *)&buf[i])->level)
  14.                         return &buf[i];
  15.         }
  16.         return NULL;
  17. }

  18. int main(void)
  19. {
  20.         char buf[100];
  21.         for(size_t i = 0; i < 100; ++i)
  22.                 buf[i] = i;

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

  26.         ((Player *)&buf[12])->id = 1;
  27.         ((Player *)&buf[12])->level = 9;
  28.         printf("%.8x\n", search(buf, 100));
  29.         return 0;
  30. }
复制代码
  1. 012ff85c
  2. 00000000
  3. 请按任意键继续. . .
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
A小小鸟 + 5 + 5 + 3 辛苦你了,谢谢

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-22 16:52:23 | 显示全部楼层
人造人 发表于 2019-2-22 16:04
你的意思是id就只能为1,level就只能为8 ,是吗?

嗯嗯,就是的,查找结构体id是1,level为8的,看看这对数据中有多少个这样的结构体,抱歉啊,下次,尽力将题目说明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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                               
};
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-22 16:55:10 | 显示全部楼层


哈哈,你来了,为上次的事情向你道歉,系统原因,我食言了,对不起
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-22 16:56:40 | 显示全部楼层
本帖最后由 A小小鸟 于 2019-2-22 16:58 编辑


谢谢你啊,辛苦了,就是代码最后返回的是查找了多少个这样的结构体,以及结构体的数据显示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-22 17:06:48 | 显示全部楼层    本楼为最佳答案   
A小小鸟 发表于 2019-2-22 16:56
谢谢你啊,辛苦了,就是代码最后返回的是查找了多少个这样的结构体,以及结构体的数据显示
  1. #include <stdio.h>
  2. #include <stdint.h>

  3. typedef struct TagPlayer
  4. {
  5.         int id;
  6.         int level;
  7. } Player;

  8. size_t search(char *buf, size_t length)
  9. {
  10.         const Player player = {1, 8};
  11.         size_t count = 0;
  12.         for(size_t i = 0; i < length; ++i)
  13.         {
  14.                 if(player.id == ((Player *)&buf[i])->id && player.level == ((Player *)&buf[i])->level)
  15.                         ++count;
  16.         }
  17.         return count;
  18. }

  19. int main(void)
  20. {
  21.         char buf[100];
  22.         for(size_t i = 0; i < 100; ++i)
  23.                 buf[i] = i;

  24.         ((Player *)&buf[12])->id = 1;
  25.         ((Player *)&buf[12])->level = 8;

  26.         ((Player *)&buf[24])->id = 1;
  27.         ((Player *)&buf[24])->level = 8;

  28.         ((Player *)&buf[32])->id = 1;
  29.         ((Player *)&buf[32])->level = 8;

  30.         ((Player *)&buf[45])->id = 1;
  31.         ((Player *)&buf[45])->level = 8;

  32.         ((Player *)&buf[67])->id = 1;
  33.         ((Player *)&buf[67])->level = 8;

  34.         ((Player *)&buf[87])->id = 1;
  35.         ((Player *)&buf[87])->level = 8;

  36.         printf("%.8x\n", search(buf, 100));
  37.         return 0;
  38. }
复制代码

  1. 00000006
  2. 请按任意键继续. . .
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
A小小鸟 + 5 + 5 + 3 谢谢热心的人造人大哥

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-22 17:31:42 | 显示全部楼层
本帖最后由 jackz007 于 2019-2-22 17:35 编辑

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. main(void)
  5. {
  6.     union c2i {
  7.         char c[8]                                                   ;
  8.         int  i[2]                                                   ;
  9.     } * p                                                           ;
  10.     char d[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,\
  11.                 0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,\
  12.                 0x00,0x33,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x00,\
  13.                 0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,\
  14.                 0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x08,0x00,0x00,\
  15.                 0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,\
  16.                 0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,\
  17.                 0x00,0x02,0x57,0x4F,0x57,0x00,0x06,0x08,0x00,0x00,\
  18.                 0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,\
  19.                 0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00 } ;
  20.     int k , m , n                                                   ;
  21.     m = 100                                                         ;
  22.     k = 0                                                           ;
  23.     n = 0                                                           ;
  24.     while(k < m - 8) {
  25.         p = (union c2i *) & d[k]                                    ;
  26.         if(p -> i[0] == 1 && p -> i[1] == 8) {
  27.             n ++                                                    ;
  28.             printf("%d : d[%d]\n" , n  , k)                         ;
  29.             k += 7                                                  ;
  30.         }
  31.         k ++                                                        ;
  32.     }
  33. }
复制代码


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

F:\[2019]\00.00.Exercise\C\Array>

评分

参与人数 1鱼币 +5 收起 理由
A小小鸟 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-22 17:32:23 | 显示全部楼层

真的谢谢你啊,你好厉害,我拜你为师了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-22 17:34:11 | 显示全部楼层
jackz007 发表于 2019-2-22 17:31
运行情况:
F:\[2019]\00.00.Exercise\C\Array>x
1 : d[43]

谢谢你啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-22 17:35:45 | 显示全部楼层
A小小鸟 发表于 2019-2-22 17:32
真的谢谢你啊,你好厉害,我拜你为师了

^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 16:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表