Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中是否有一种数组类型允许字符串用作索引?_C - Fatal编程技术网

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中是实类型,通常只是作为语法指针来实现。这根本不是真的。数组不是指针。数组是数组。(大多数对数组的操作都是通过指针操作完成的,但这不是一回事。)数组不是指针,更不用说“语法”了