c中是否有一种数组类型允许字符串用作索引?
我正在寻找类似于:c中是否有一种数组类型允许字符串用作索引?,c,C,我正在寻找类似于: a[“hello”]指向一个列表,a[“h”]指向另一个列表 基本上,我正在寻找一个关联数组实现。不,不是在C中。您可能希望查看哈希表库以获得所需内容。不,不是在C中。您可能希望查看哈希表库以获得所需内容。不,数组只是指针,索引运算符([])只是以下内容的简写: a[i] == *(a + i * sizeof(*a)) 不,数组只是指针,索引运算符([])只是以下内容的简写: a[i] == *(a + i * sizeof(*a)) 一点小技巧:虽然字符串通常不能
a[“hello”]
指向一个列表,a[“h”]
指向另一个列表
基本上,我正在寻找一个关联数组实现。不,不是在C中。您可能希望查看哈希表库以获得所需内容。不,不是在C中。您可能希望查看哈希表库以获得所需内容。不,数组只是指针,索引运算符([])只是以下内容的简写:
a[i] == *(a + i * sizeof(*a))
不,数组只是指针,索引运算符([])只是以下内容的简写:
a[i] == *(a + i * sizeof(*a))
一点小技巧:虽然字符串通常不能用作索引,但在某些狭窄的情况下,它们是有效的
考虑这一行代码:
printf("%c", 1["hello"]);
输出为“e”
这利用了a[b]=*(a+b)=*(b+a)==b[a]的属性。因此,1[“hello”]=“hello”[1],这显然导致了第二个字母“e”有点琐事:虽然字符串通常不能用作索引,但在某些狭窄的情况下,它们是有效的 考虑这一行代码:
printf("%c", 1["hello"]);
输出为“e”
这利用了a[b]=*(a+b)=*(b+a)==b[a]的属性。因此,1[“hello”]==“hello”[1],这显然会导致第二个字母“e”您不能完全按照所写的那样执行(就像您在python或perl中所做的那样),但是,如果您想使用字符串作为索引。听起来很像您想要一个perl哈希或字典。我有一个非常轻量级的C字典/ahash实现,它允许您使用任何东西作为键(索引),包括字符串 下面是一个使用字符串作为索引器的简单示例:
XRHash * dict = xr_init_hash( xr_hash__strhash, xr_hash__strcmp );
/* add things to the hash */
if ( xr_hash_contains( dict, "mary" ) != XRHASH_EXISTS_TRUE )
printf("does not contain mary\n");
xr_hash_add( dict, "fred", strdup("my name is fred") );
xr_hash_add( dict, "mary", strdup("my name is mary") );
xr_hash_add( dict, "sally", strdup("my name is sally") );
xr_hash_add( dict, "bob", strdup("my name is bob") );
/* test if things exist */
if ( xr_hash_contains( dict, "mary" ) == XRHASH_EXISTS_TRUE )
printf("does contain mary\n");
/* iterate the hash */
xrhash_fast_iterator * iter = xr_init_fasthashiterator( dict );
char * hashkey = NULL;
do {
hashkey = (char*) xr_hash_fastiteratekey( iter );
if ( hashkey != NULL ){
/* get values */
char * data;
xr_hash_get( dict, (void*)hashkey, (void**)&data );
printf("key = %s, value = %s\n", hashkey, data );
} else {
break;
}
} while ( 1 );
以上内容的完整来源是
编辑:
事实证明,同样的事情也发生了,而且更多的是来自油嘴滑舌的人。但是我的lib速度非常快:)您不能完全按照编写的那样执行此操作(就像您在python或perl中所做的那样),但是,如果您想使用字符串作为索引。听起来很像您想要一个perl哈希或字典。我有一个非常轻量级的C字典/ahash实现,它允许您使用任何东西作为键(索引),包括字符串 下面是一个使用字符串作为索引器的简单示例:
XRHash * dict = xr_init_hash( xr_hash__strhash, xr_hash__strcmp );
/* add things to the hash */
if ( xr_hash_contains( dict, "mary" ) != XRHASH_EXISTS_TRUE )
printf("does not contain mary\n");
xr_hash_add( dict, "fred", strdup("my name is fred") );
xr_hash_add( dict, "mary", strdup("my name is mary") );
xr_hash_add( dict, "sally", strdup("my name is sally") );
xr_hash_add( dict, "bob", strdup("my name is bob") );
/* test if things exist */
if ( xr_hash_contains( dict, "mary" ) == XRHASH_EXISTS_TRUE )
printf("does contain mary\n");
/* iterate the hash */
xrhash_fast_iterator * iter = xr_init_fasthashiterator( dict );
char * hashkey = NULL;
do {
hashkey = (char*) xr_hash_fastiteratekey( iter );
if ( hashkey != NULL ){
/* get values */
char * data;
xr_hash_get( dict, (void*)hashkey, (void**)&data );
printf("key = %s, value = %s\n", hashkey, data );
} else {
break;
}
} while ( 1 );
以上内容的完整来源是
编辑:
事实证明,同样的事情也发生了,而且更多的是来自油嘴滑舌的人。虽然我的lib非常快:)不是直接的,但是在C中有许多哈希表实现 我还没有试过,但它几乎是谷歌搜索的顶端。(大概它不允许您使用
a[“hello”]
语法。)
(如果使用C++而不是C是一个选项,像<代码> map <代码>可能是一个好的解决方案。
不直接,但是在c/p>中有许多哈希表实现。 我还没有试过,但它几乎是谷歌搜索的顶端。(大概它不允许您使用a[“hello”]
语法。)
(如果使用C++而不是C是一个选项,像<代码> map <代码>可能是一个好的解决方案。
它被称为代码> STD::MAP< /Cord>,可以使用<代码> STD::String < /Cord>作为键。< /P><>请注意,这只是C++中的一个选项,而不是C。但是,我想这可能是你所要寻找的,因为很多时候新手会把C问题标记为C++,而另一种方式。
它被称为<代码> STD::MAP< /Cord>,你可以使用<代码> STD::String < /Cord>作为关键字。
<>请注意,这只是C++中的一个选项,而不是C。然而,我认为这可能是你所要寻找的,因为很多时候新手会把C问题标记为C++,而另一方面。<>(P>)P>所有的答案都只集中在语法上,而不是解决问题。如果您真的需要一个“关联数组”,您需要找到或编写一些库例程来提供这样的数据结构。C没有任何高级数据结构作为内置类型或标准库的一部分<代码>油嘴滑舌肯定能提供您想要的东西
但是请注意:(!!)如果您发现自己需要特殊应用程序之外的关联数组,其中密钥来自外部世界(而不是程序内部),我认为您应该真正评估(1)是否有更好的方法来实现您在C中尝试实现的目标,或者(2)你是否真的想用C语言编程。关联数组不是C语言的习惯用法,当另一种数据类型可以使用时使用它们,你就丢掉了C语言的许多优点,只是保留了C语言的所有痛苦。到目前为止,所有的答案都只关注语法,而不是解决你的问题。如果您真的需要一个“关联数组”,您需要找到或编写一些库例程来提供这样的数据结构。C没有任何高级数据结构作为内置类型或标准库的一部分<代码>油嘴滑舌肯定能提供您想要的东西
但是请注意:(!!)如果您发现自己需要特殊应用程序之外的关联数组,其中密钥来自外部世界(而不是程序内部),我认为您应该真正评估(1)是否有更好的方法来实现您在C中尝试实现的目标,或者(2)不管你是否真的想用C语言编程。关联数组不是C语言的习惯用法,当另一种数据类型需要时使用它们,你抛弃了C语言的许多优点,只是保留了C语言的所有痛苦。,除了
*sizeof(*a)
是指针算法中隐含的。这不是严格意义上的事实。数组在C中是实类型,通常只是作为语法指针来实现。这根本不是真的。数组不是指针。数组是数组。(大多数对数组的操作都是通过指针操作完成的,但这不是一回事。)数组不是指针,更不用说“语法”了