任务是搜索是否可以在另一个数组中找到一个数组。函数中有四个参数,它们都是指针。
*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作为输出。
答案 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;
,请注意编译器警告。