C 数组中包含的输入序列
我正在尝试实施这个练习,但效果不太好。它应该告诉我数组B中的序列是否包含在A中。有什么想法吗?我有一个问题,让它为每一个序列工作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
#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]&&jfor(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" );
}