检查一个数组是否在另一个数组内-C编程

时间:2018-08-16 22:52:31

标签: c arrays function pointers

任务是搜索是否可以在另一个数组中找到一个数组。函数中有四个参数,它们都是指针。

*p1, *p2, *q1, *q2

p1和p2分别指向第一个数组的开始和结尾,q1和q2相同,它们仅用于第二个数组。如果在第一个数组中找到第二个数组,则该函数必须返回第一个数组中第一个元素的索引,该索引也是第二个数组的开头。如果找不到这样的数组,该函数必须返回值-1。例如,如果我们有两个数组

Niz1[] = {1, 2, 3, 4, 5, 6, 7};
Niz2[] = {2, 3, 4};

结果将为2,因为这是数组的第一个公共元素的索引。我写了几乎可以正常工作的代码,但例如在数组中

niz1[10]={1,1,2,3,5,6,1,2,3,10};
niz2[10]={1,1,2,3,5,6,1,2,3,10};

输出为-1,就好像第二个数组不在第一个数组中一样,而实际上它应该为1,因此这一直存在问题。 这是我的代码:

int Podniz (const int *p1, const int *p2, const int *q1, const int *q2)
{

    int i=0;

    while(*p1!=*q1)
    {
        i++;
        p1++;
    }
    int *pomocni=p1;
    while(pomocni<p2 && q1<q2)
    {
            if(*pomocni == *q1)
            {
                pomocni++;
                q1++;
            }
            else if(*pomocni != *q1)
                return -1;
    }
    return i;
}

int main() {
    int niz1[10]={1,1,2,3,5,6,1,2,3,10};
    int niz2[3]={1,2,3};
    int k = Podniz(niz1, niz1+10, niz2, niz2+3);
    printf("%d", k);
    return 0;
}

您能帮我解决这个问题,所以我的代码可以100%正确吗? 我添加了我忘记使用的函数的代码的主要部分。这两个数组是我得到错误输出的示例。

int Podniz (const int *p1, const int *p2, const int *q1, const int *q2)
{


    int i=0;

    while(*p1!=*q1)
    {
        i++;
        p1++;
    }
    const int *pomocni=p1;
    while(p1<p2)
    {
    while(pomocni<p2 && q1<q2)
    {
            if(*pomocni == *q1)
            {
                pomocni++;
                q1++;
            }
            else if(*pomocni != *q1)
                return -1;
    }
    return i;
}
}

我已尝试按照建议的那样更改功能,但仍然获得-1作为输出。

1 个答案:

答案 0 :(得分:0)

首先,这是您遇到的错误。该错误来自以下事实:第一个数组以两个开头,而第二个数组仅以一个开头。您做错了什么,是当您尝试找出要在p1中寻找的位置时。对于那些可以解决问题的情况,您的代码似乎很好。

您将要使用此部分:

while(pomocni<p2 && q1<q2)
{
        if(*pomocni == *q1)
        {
            pomocni++;
            q1++;
        }
        else if(*pomocni != *q1)
            return -1;
}
return i;

,但将其包装在循环中,并尝试将其用于第一个数组中的所有元素。记住要检查边界条件,以免读到数组之外。

还有一件小事。 int *pomocni=p1;应该为const int *pomocni=p1;,请注意编译器警告。