字符串可以用作C中的数组索引吗?
例如:字符串对应值"ONE“1 "TWO”2 "FIVE“5 "TEN”10
当上面列表中的字符串传递给函数时,函数必须返回上面指示的相应值。这可以通过声明一个以字符串作为索引的常量数组来实现吗
int *x;
x["ONE"] = 1;
x["TWO"] = 2;
x["FIVE"] = 5;
x["TEN"] = 5;
return x["string received by the function"];上面的逻辑不能像预期的那样工作;有没有解决办法来实现上面的逻辑以便拥有一个字符串索引的数组?
发布于 2009-01-06 11:57:59
它可能会编译,但不会工作。
现在还不完全清楚你想要实现什么。我认为你需要一个associative array,在这种情况下,你应该找到一个的库实现。
如果您正在寻找更像enumerated type的东西,并且您可以依赖于C89,那么可以看看下面这样的东西:
enum cardsuit {
CLUBS,
DIAMONDS,
HEARTS,
SPADES
};如果您不能依赖C89,那么您应该尝试一些typedef技巧。
发布于 2009-01-06 14:39:15
对于您应该做什么,还有其他很好的答案,所以我想我应该解释一下您正在做什么,以及为什么它正在编译但不工作。
在C中,数组引用是通过数组或指针和某种整数来完成的。(在x1中,x是数组,1是整数)。只要你使用了一些整型,它就会像你所期望的那样工作。
假设你有一个不是整数的东西。在这种情况下,C实现将查看是否可以将其转换为适当的类型,因此最终得到数组和整数。就像这样的情况,你会遇到麻烦(在C++中稍微复杂一点的版本会让比你更有经验的人感到困惑)。
在C中,像"one“这样的文字字符串的类型是const char *,这意味着指向不能更改的字符的指针。实际值是字符串在内存中实际驻留的内存地址。通常,您不会注意这个指针值,而是查看字符串值,但这里有一个问题。
在C语言中,任何数据指针都可以转换成某种整数,并且会自动转换为整数。因此,您得到了一个类似于“1”的字符串,它的值是表示内存地址的任何数字。在C需要某种整数的地方使用它,它将被转换为某个整数值或其他值。
因此,这就是x“1”所发生的事情。C系统必须将字符串"ONE“放在内存中的某个地方,而不管它放在哪里。它很可能位于内存地址相当大的地方,很可能是数十亿。当它看到x“1”时,它会尝试将该值转换为整数,并将其用作下标。因此,您试图访问数组x,远远超出了它的界限,这就是导致问题的原因。要么你试图使用你不被允许的内存,而系统只是阻止你,要么你在摆弄一块你应该留在一边的内存,它很可能会以某种神秘的方式失败。
发布于 2009-01-06 12:45:24
您可以使用stdlib.h提供的函数bsearch()轻松构建查找表。下面是一个有效的示例:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define count(ARRAY) (sizeof(ARRAY)/sizeof(*ARRAY))
struct item
{
const char * name;
int value;
};
static _Bool sorted;
static struct item items[] =
{
{ "one", 1 },
{ "two", 2 },
{ "three", 3 },
{ "ten", 10 }
};
static int compare(const void * p1, const void * p2)
{
return strcmp(*((const char **)p1), *((const char **)p2));
}
int get(const char * name)
{
if(!sorted)
{
qsort(items, count(items), sizeof(*items), compare);
sorted = 1;
}
struct item * item = bsearch(&name, items, count(items), sizeof(*items),
compare);
return item ? item->value : 0;
}
int main(int argc, char ** argv)
{
int i;
for(i = 1; i < argc; ++i)
printf("%i\n", get(argv[i]));
return 0;
}https://stackoverflow.com/questions/416237
复制相似问题