C语言结构体的查找
小菜鸟,今天遇到一个难题,在一堆数据里面查找结构体,求大哥,能帮助我解决一下这个问题,{:5_111:} 具体题目见图片,5鱼币酬谢(系统只能给这么多,请不要不要嫌弃) {:10_319:} 你最好贴代码,要不然写数组就很麻烦 这个问题不好解决,一般情况下是无解的要解决这个问题就需要把这个问题特殊化
我随便选一个内存地址,从这个内存地址取两个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这个数据的
我们完全可以模拟这个过程,用这种方法查找是最好的
你的意思是id就只能为1,level就只能为8 ,是吗? #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
请按任意键继续. . . 人造人 发表于 2019-2-22 16:04
你的意思是id就只能为1,level就只能为8 ,是吗?
嗯嗯,就是的,查找结构体id是1,level为8的,看看这对数据中有多少个这样的结构体,抱歉啊,下次,尽力将题目说明白 行客 发表于 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
};
ba21 发表于 2019-2-22 14:56
哈哈,你来了,为上次的事情向你道歉,系统原因,我食言了,对不起 本帖最后由 A小小鸟 于 2019-2-22 16:58 编辑
人造人 发表于 2019-2-22 16:12
谢谢你啊,辛苦了,就是代码最后返回的是查找了多少个这样的结构体,以及结构体的数据显示 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: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> 人造人 发表于 2019-2-22 17:06
真的谢谢你啊,你好厉害,我拜你为师了{:5_109:} jackz007 发表于 2019-2-22 17:31
运行情况:
F:\\00.00.Exercise\C\Array>x
1 : d
谢谢你啊 A小小鸟 发表于 2019-2-22 17:32
真的谢谢你啊,你好厉害,我拜你为师了
^_^
页:
[1]