包含在数组中的输入序列

时间:2013-08-09 18:02:37

标签: c arrays

我正在尝试实施此练习,但效果不佳。它应该告诉我数组B中的序列是否包含在A中。任何想法?我有一个问题,让它适用于每个序列。

#include <stdio.h>
#include <stdlib.h>

#define N 6
#define M 3

int contains(int v[], int n);

/*
 * 
 */
int main(int argc, char** argv)
{
    int A[N], B[M];
    int i, j = 0, flag = 0, contained = 1;

    printf("Array A\n");
    for (i = 0; i < N; i++)
    {
        printf("Insert element: ");
        scanf("%d", &A[i]);
    }

    printf("Array B\n");
    for (i = 0; i < M; i++)
    {
        printf("Insert element: ");
        scanf("%d", &B[i]);
    }

    for (i = 0; i < (N - M + 1); i++)
    {
        flag = 0;

        if (A[i] == B[j])
        {
            flag = 1;
            j++;
        }

        if (flag == 0 && (i == N-M))
        {
            contained = 0;
            printf("The sequence B is not contained in A!\n");
            break;
        }
    }

    if (contained == 1)
    {
        printf("The sequence B is contained in A\n");
    }

    return (EXIT_SUCCESS);
}

6 个答案:

答案 0 :(得分:1)

如果序列中存在不匹配,则永远不会重置j,因此您可以开始查找序列的其余部分,从剩下的值j开始。您的程序会查找序列B,但不要求它是连续的。

您也不会检查序列何时完成,因此例如B位于A的开头,j将继续递增,B[j]将溢出到未知内存中,不太可能与A匹配,因此会给您一个不正确的结果。要解决此问题,只需检查找到整个B的时间并退出循环。

替换以下内容将解决此问题:

if (j == M) break; // Break the loop when B sequence is found
if (flag == 0)
{
    j = 0;    // This was missing
    if (i == N-M)
    {
        contained = 0;
        printf("The sequence B is not contained in A!\n");
        break;
    }
}

答案 1 :(得分:1)

对于您进行检查时的第三个for循环,您(1)实际上没有检查B的每个元素与A的对应元素和(2) )不检查不同的起始指数。你可能想要做的是像

for (i = 0; i < (N - M + 1); i++) {
    for (j = 0; j < M; j++) {
        if (A[i + j] != B[j]) {
            break;
        }
    }
    if (j == M) {
        printf("Found a match!");
    }
}

答案 2 :(得分:0)

如果你发现B的元素与A不匹配,那么你需要将j设置回0

答案 3 :(得分:0)

要在A中搜索B,您可能需要执行以下操作:

for (i = 0; i < (N - M + 1) ; i++)
    if (A[i] == B[0])
    {  j=0;
       while (A[++i] == B[++j] && j<M);
       break;
    }

if (j == M)
{
    printf("The sequence B is contained in A\n");
}

else{
    printf("The sequence B is not contained in A\n");
}

答案 4 :(得分:0)

for (i = 0; i < (N - M + 1); i++)
{
    int j;
    for(j = 0; j < M; j++) 
    {
        if(B[j] != A[j + i])
            break;
    }
    /* sequence found */
    if(j == M)
    {
        return true;
    }
}

return false;

答案 5 :(得分:0)

GCC有memmem()扩展函数(基本上是strstr(),但不依赖于NUL终止的字符串)

if (memmem(A, N * sizeof *A, B, M * sizeof *B)) {
   printf("Found\n" );
} else {
   printf("Not Found\n" );
   }