3

我是 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 中是否存在这样的东西,它比我的版本更快、更灵活?

4

2 回答 2

5

您编写的代码在几个级别上是错误的。你的线

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

创建一个指针数组char,每个指针指向一个 -NULL终止的字符串。到目前为止,一切都很好。但是,您的线路

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

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

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

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

你想要的是一个使用 的循环,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将不起作用,因此在这种情况下您必须显式传递元素的数量。

于 2012-06-04T02:57:39.027 回答
1

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

bsearch对于一般数组,如果对数组进行排序,则有库函数。大多数编译器提供了一个lsearch非标准函数,它只是对数组进行线性搜索以找到给定值。

如果您使用的是 C++,那么您可以访问执行类似任务的 、 和 STLfind算法lower_boundupper_bound

希望这可以帮助!

于 2012-06-04T02:42:19.533 回答