Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数组中包含的输入序列_C_Arrays - Fatal编程技术网

C 数组中包含的输入序列

C 数组中包含的输入序列,c,arrays,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

我正在尝试实施这个练习,但效果不太好。它应该告诉我数组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);
}
#包括
#包括
#定义n6
#定义m3
int包含(int v[],int n);
/*
* 
*/
int main(int argc,字符**argv)
{
int A[N],B[M];
int i,j=0,flag=0,contained=1;
printf(“数组A\n”);
对于(i=0;i
当序列中存在不匹配项时,您永远不会重置
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;
    }
}

在A中旋转时,如果发现B的某个元素与A不匹配,则需要将j设置回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");
}
for(i=0;i<(N-M+1);i++)
如果(A[i]==B[0])
{j=0;
而(A[++i]==B[++j]&&j
for(i=0;i<(N-M+1);i++)
{
int j;
对于(j=0;j
对于第三个
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!");
    }
}
for(i=0;i<(N-M+1);i++){
对于(j=0;j
GCC具有memmem()扩展函数(基本上是strstr(),但不依赖以NUL结尾的字符串)


我认为这不是正确的解决方案。如果我插入序列:1 2 5 10 9 11和数组B 1 2 5,程序不工作,我刚刚注意到,正在修复
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!");
    }
}
if (memmem(A, N * sizeof *A, B, M * sizeof *B)) {
   printf("Found\n" );
} else {
   printf("Not Found\n" );
   }