我正在寻找类似的东西:
a["hello"]
指向列表,a["h"]
指向另一个列表。
基本上,我正在寻找一个关联数组实现。
答案 0 :(得分:1)
不,不在C中。您可能希望查看哈希表库以获得所需内容。
答案 1 :(得分:1)
有点琐事:虽然字符串通常不能用作索引,但在某些狭窄的情况下,它们是有效的。
考虑这行代码:
printf("%c", 1["hello"]);
输出为“e”。
这利用了a [b] == *(a + b)== *(b + a)== b [a]的属性。
结果,1 [“你好”] ==“你好”[1],这显然导致第二个字母“e”
答案 2 :(得分:1)
你不能完全按照书面形式执行此操作(就像你在
以下是使用字符串作为索引器的简短示例:
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 );
上述内容的完整来源为here
编辑:
还有来自GLib的Hash Tables做同样多的事情。我的lib很快,但是:)
答案 3 :(得分:1)
不直接,但在C中有许多哈希表实现。
Here's one example.我没有尝试过,但它接近Google搜索的顶部。 (据推测,它不允许您使用a["hello"]
语法。)
(如果使用C ++而不是C是一个选项,像map
之类的东西可能是一个很好的解决方案。)
答案 4 :(得分:0)
到目前为止,所有答案都只关注语法,而不是解决问题。如果你真的需要一个"关联数组",你需要找到或写一些库例程来提供这样的数据结构。 C没有任何高级数据结构作为内置类型或标准库的一部分。 glib
肯定会提供您正在寻找的内容。
但请注意:(!!)如果您发现自己需要关键数组,而这些数组来自外部世界的密钥(而不是程序中),我认为您应该真正评估(1)是否存在#39;更好的方法来做你在C中尝试实现的目标,或者(2)你是否真的想要用C编程。关联数组不是一个C语言,并且通过在另一种数据类型的情况下使用它们,你可以摒弃C的许多优点,并且只是保留C的所有痛苦。
答案 5 :(得分:-2)
不,数组只是指针而索引运算符([])只是简写:
a[i] == *(a + i * sizeof(*a))
答案 6 :(得分:-3)
它被称为std::map
,您可以使用std::string
作为密钥。
请注意,这只是C ++中的一个选项,而不是C.但是,我认为它可能正是您所寻找的,因为很多时候新手会将C问题标记为C ++,反之亦然。