gpt4 book ai didi

c - 使数组名称运行时并访问其元素

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:15 25 4
gpt4 key购买 nike

static const unsigned char pkt1[89] = {
0x00, 0x00, 0x5e, 0x00, 0x01, 0x12, 0x00, 0x18, /* ..^..... */
0x82, 0x5e, 0x5a, 0xf6, 0x08, 0x00, 0x45, 0xb8, /* .^Z...E. */
0x00, 0x4b, 0x9d, 0x0d, 0x00, 0x00, 0x3f, 0x11, /* .K....?. */
};

/* Frame (89 bytes) */
static const unsigned char pkt2[89] = {
0x00, 0x00, 0x5e, 0x00, 0x01, 0x12, 0x00, 0x18, /* ..^..... */
0x82, 0x5e, 0x5a, 0xf6, 0x08, 0x00, 0x45, 0xb8, /* .^Z...E. */
0x00, 0x4b, 0x9d, 0x25, 0x00, 0x00, 0x3f, 0x11, /* .K.%..?. */
}

....
...

till pkt[100];


int main()
{

char buff[10]="pkt";
for(i=0;i<100;i++)
{
itoa(1,buff+3,10);
printf("%s",buff);
}

}

从上面的代码中,我可以看到连接的名称为 pkt1/pkt2...直到 pkt100。但是我现在不知道如何访问 pkt1 的元素。欢迎提出任何建议。我可以执行此运行时吗?

最佳答案

不是没有自己实现,不是。 C 在运行时不保留变量名,因此如果您想使用名称映射到数组,您将不得不自己实现它:

const unsigned char * get_pkt(const char *name)
{
if(strcmp(name, "pkt1") == 0)
return pkt1;
if(strcmp(name, "pkt2") == 0)
return pkt2;
return NULL;
}

更新:如果您需要匹配的事物数量很大,像上面这样的代码编写起来既乏味又容易出错!并且会影响性​​能。在这些情况下,正确的解决方案是将对象放入某个键值数据结构中,例如哈希表。请注意,C 没有内置哈希表数据类型,因此您只能靠自己了。不过,有许多可用的实现:glib's GHashTable is one .

如果您想留在 C 标准库中,我会把数据放在一个数组中,对其进行排序(使用 qsort() ),然后使用 bsearch() 对其进行二进制搜索。 .对于约 1000 个键,应该不会超过约 10 次字符串比较。

当然,即使使用这些技巧,您也无法避免初始化数据结构的需要。使用数组,您可以在定义数据包时以相同的方式进行数组初始化:

static struct {
const char *name;
const unsigned char packet[89];
} packets[] = {
{ "pkt1", { 0x00, 0x00, 0x5e, 0x00, 0x01, /* ... more */ } },
};

这只是重新组织您已有的源文本,并添加一些标点符号。如果您注意以正确的顺序给出这些,您也不需要在运行时排序!

关于c - 使数组名称运行时并访问其元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21257170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com