C中的数组是否有一个indexOf等价物?

时间:2012-06-04 02:40:03

标签: c arrays

我是C的新手,希望我能用到内置的东西。假设我有一个列表,我想找到列表的位置(列表中的所有项目都是唯一的)。像这样: char *name[] = {"monkey", "pig", "goat", "dog", "cat"};我试过了:

   char *name[] =  {"monkey", "pig", "goat", "dog", "cat"};
   int *found = strstr (*name,"dog");
   printf("Found at %i \n", found); //expect 3(or 4, if it doesn't use 0s) result

但它一直给我2的结果(即使我把名字不存在)。我将strstrstrcspn交换,但也没有运气。

我在问,因为我不确定,我创建了自己的功能来做这个,但它非常糟糕而且不够灵活(我在其中硬编码列表名称),我想如果C中有什么东西那么它会对我来说更好这是我做的功能(如果你不想让脑细胞读取它,请盖住你的眼睛,开个玩笑: - ):

int indexOf(char nameToFind) {
    //returns the location of an item in a list
    int pos = -1;
    int i;
    for (i = 0; i < sizeof(name) / sizeof(name[0]) && pos == -1; i++)
    {
        // Assuming there is a char[] field called name in Stdinfo
        if (*name[i] == nameToFind) {
            pos = i;
        }
    }
    return pos;
}

在C中存在这样的事情会更快和更快比我的版本更灵活?

2 个答案:

答案 0 :(得分:5)

你写的代码在几个层面上是错误的。你的行

char *name[] = {"monkey", "pig", "goat", "dog", "cat"};

创建一个char指针数组,每个指针都指向一个以NULL结尾的字符串。到现在为止还挺好。但是,你的行

int *found = strstr (*name,"dog");

found设置为指向"dog"中第一次出现*name = name[0] = "monkey"的指针。除了不按预期查看数组name之外,您还要将char *返回的strstr分配给int *。不好。你的下一行

printf("Found at %i \n", found);

尝试打印found,但说明符需要int并且您传递foundint *。这些都是要避免的事情,我认为很多都是未定义的行为。

你想要的是一个使用strcmp的循环,例如:

char *name[] = {"monkey", "pig", "goat", "dog", "cat"};
unsigned int numElements = sizeof(name)/sizeof(name[0]);
unsigned int i;
for(i = 0; i < numElements; ++i) {
    if (strcmp(name[i], "dog") == 0) {
        printf("Found at %u\n", i);
        break;
    }
}
if (i >= numElements) {
    printf("Not found\n");
}

如果将数组传递给函数,以这种方式计算numElements将不起作用,因此在这种情况下你必须显式传递元素的数量。

答案 1 :(得分:1)

对于字符数组,有strchr函数,它在数组中搜索字符。如果找到它,则返回指向该字符的指针。如果没有,它将返回一个NULL指针。然后,您可以使用指针减法来确定索引。

对于通用数组,如果数组已排序,则存在库bsearch函数。大多数编译器都提供lsearch非标准函数,只需对数组进行线性搜索即可找到给定值。

如果您使用的是C ++,则可以访问执行类似任务的findlower_boundupper_bound STL算法。

希望这有帮助!