我试图在一个int数组数据中写一个函数int* findPair(int* data, int numEls, int first, int second)
to搜索一个等于first的元素,然后紧跟一个元素second。如果发生这种情况,该函数首先返回指向该元素的指针。如果情况在数组中出现多次,则指针应该是第一次出现的。我的代码是这样的:
#include <stdio.h>
int* findPair(int* data, int numEls, int first, int second)
{
int i = 0;
int *n = NULL;
for (i = 0; i < numEls; i++) {
if(data[i] == first && data[i + 1] == second) {
n = &data[i];
}
}
return n;
}
int main()
{
int data[] = {1, 10, 2, 1, 2, 1, 2};
int* p = findPair(data, 7, 1, 2);
if (p != NULL) {
printf("Found at position %zd\n", p - data);
}
else {
puts("Not found");
}
}
当我进入两个qazxsw poi进行测试时,它指向第二次出现(位置5而不是位置3)。任何提示我做错了什么?
1,2
函数中的for
循环不会在第一次出现时停止。相反,它继续前进,搜索更多对,并且每当遇到一对时,它会覆盖findPair
。因此,n
将始终指向最后一次出现(嗯,指向最后一次出现的第一个元素)。
一旦找到第一次出现,就需要停止n
循环。
使用for
语句从循环中提前退出:
break
当找到第一对时,for (i = 0; i < numEls; i++) {
if(data[i] == first && data[i + 1] == second) {
n = &data[i];
break;
}
}
将被设置为指向一对中的第一个元素,并且循环将立即退出,跳转到函数的n
语句。
是的,你的循环总是找到数组中最右边的一对。请参阅,如果找到匹配项,则循环仍会继续,稍后会重新分配n以指向其他元素。
此外,如果您向该数组添加一个元素:
return
行为将变为未定义(您的程序可能会出现段错误。)
因此要么将数组的长度减去1来传递函数,要么更好地正确终止循环:
int data[] = {1, 10, 2, 1, 2, 1, 2, 1};
int* p = findPair(data, 8, 1, 2);
作为额外的小优化,您可以在某些情况下避免额外的比较:
for (i = 0; i < numEls - 1; i++) {
if(data[i] == first && data[i + 1] == second) {
n = &data[i];
break;
}
}