c中是否有一种允许字符串用作索引的数组?

时间:2011-09-29 17:31:18

标签: c

我正在寻找类似的东西:

a["hello"]指向列表,a["h"]指向另一个列表。

基本上,我正在寻找一个关联数组实现。

7 个答案:

答案 0 :(得分:1)

不,不在C中。您可能希望查看哈希表库以获得所需内容。

答案 1 :(得分:1)

有点琐事:虽然字符串通常不能用作索引,但在某些狭窄的情况下,它们是有效的。

考虑这行代码:

printf("%c", 1["hello"]);

输出为“e”。

这利用了a [b] == *(a + b)== *(b + a)== b [a]的属性。
结果,1 [“你好”] ==“你好”[1],这显然导致第二个字母“e”

答案 2 :(得分:1)

你不能完全按照书面形式执行此操作(就像你在或perl中可以那样)但是,如果你想使用字符串作为索引。听起来很像你想要一个perl哈希或字典。我有一个非常轻量级的C字典/ ahash实现,它允许你使用任何东西作为包括字符串的键(索引)。

xrhash - guthub

以下是使用字符串作为索引器的简短示例:

  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 ++,反之亦然。

相关问题