我是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的结果(即使我把名字不存在)。我将strstr
与strcspn
交换,但也没有运气。
我在问,因为我不确定,我创建了自己的功能来做这个,但它非常糟糕而且不够灵活(我在其中硬编码列表名称),我想如果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中存在这样的事情会更快和更快比我的版本更灵活?
答案 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
并且您传递found
,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
将不起作用,因此在这种情况下你必须显式传递元素的数量。
答案 1 :(得分:1)