我正在尝试实施此练习,但效果不佳。它应该告诉我数组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);
}
答案 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" );
}