首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串可以用作数组索引吗?

字符串可以用作数组索引吗?
EN

Stack Overflow用户
提问于 2009-01-06 11:53:12
回答 8查看 21.2K关注 0票数 7

字符串可以用作C中的数组索引吗?

例如:字符串对应值"ONE“1 "TWO”2 "FIVE“5 "TEN”10

当上面列表中的字符串传递给函数时,函数必须返回上面指示的相应值。这可以通过声明一个以字符串作为索引的常量数组来实现吗

代码语言:javascript
复制
int *x;
x["ONE"]  = 1;
x["TWO"]  = 2;
x["FIVE"] = 5;
x["TEN"]  = 5;

return x["string received by the function"];

上面的逻辑不能像预期的那样工作;有没有解决办法来实现上面的逻辑以便拥有一个字符串索引的数组?

EN

回答 8

Stack Overflow用户

发布于 2009-01-06 11:57:59

它可能会编译,但不会工作。

现在还不完全清楚你想要实现什么。我认为你需要一个associative array,在这种情况下,你应该找到一个的库实现。

如果您正在寻找更像enumerated type的东西,并且您可以依赖于C89,那么可以看看下面这样的东西:

代码语言:javascript
复制
enum cardsuit {
   CLUBS,
   DIAMONDS,
   HEARTS,
   SPADES
};

如果您不能依赖C89,那么您应该尝试一些typedef技巧。

票数 19
EN

Stack Overflow用户

发布于 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,远远超出了它的界限,这就是导致问题的原因。要么你试图使用你不被允许的内存,而系统只是阻止你,要么你在摆弄一块你应该留在一边的内存,它很可能会以某种神秘的方式失败。

票数 10
EN

Stack Overflow用户

发布于 2009-01-06 12:45:24

您可以使用stdlib.h提供的函数bsearch()轻松构建查找表。下面是一个有效的示例:

代码语言:javascript
复制
#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;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/416237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档