【问题标题】:Check if an array is inside another array - C programming检查一个数组是否在另一个数组中 - C 编程
【发布时间】: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


【解决方案1】:

首先,这是您遇到的错误。该错误来自这样一个事实,即第一个数组以两个 1 开头,而第二个数组仅以一个开头。当你试图找出你想在 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; 注意编译器警告。

【讨论】:

  • 只有在你不立即返回的情况下,把它放在一个循环中才会有帮助。
  • 我已经尝试过了,但仍然是相同的输出。我已将该功能添加到我最初的问题中。
猜你喜欢
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
相关资源
最近更新 更多