鱼C论坛

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

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

[复制链接]
发表于 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这个数据的
我们完全可以模拟这个过程,用这种方法查找是最好的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-22 16:04:12 | 显示全部楼层
你的意思是id就只能为1,level就只能为8 ,是吗?
小甲鱼最新课程 -> https://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 辛苦你了,谢谢

查看全部评分

小甲鱼最新课程 -> https://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 谢谢热心的人造人大哥

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-2 00:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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