找到int数组中的第一个出现

问题描述 投票:-1回答:2

我试图在一个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)。任何提示我做错了什么?

c
2个回答
2
投票

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语句。


2
投票

是的,你的循环总是找到数组中最右边的一对。请参阅,如果找到匹配项,则循环仍会继续,稍后会重新分配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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.