【发布时间】:2018-08-16 22:52:30
【问题描述】:
任务是搜索一个数组是否可以在另一个数组中找到。函数中有四个参数,都是指针。
*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。
【问题讨论】:
-
如何调用
int Podniz (const int *p1, const int *p2, const int *q1, const int *q2)函数?您需要提供所有代码。 -
while(*p1!=*q1) { i++; p1++; }是可怕的代码,因为循环可以继续下去,远远超过p2。 -
我已经添加了代码的主要部分。
-
“结果将为 2,因为这是数组的第一个公共元素的索引” - FALSE。结果将是
1,它是Niz1内的索引,Niz2开始的位置。 (数组在 C 中是零索引)
标签: c arrays function pointers