在 C 中搜索 2 个数组之间的匹配元素

Searching for matching elements between 2 arrays in C

问题

有两个数组,一个包含大量数字 (arr1),可能有一些重复序列,例如 1,2,4 可能在此数组中重复多次。还有另一个数组(arr2)将由用户分配。

我需要一种方法来搜索 arr1 以获得用户为 arr2 提供的确切输入。要使匹配有效,所有元素的顺序必须与用户输入的顺序完全相同。

例如,如果用户输入 1,2,4,3,程序必须按照 arr1 中的确切顺序查找 1,2,4,3,这意味着 1,2,3 ,4 中的 arr1 不应算作匹配项。以下是我到目前为止所能想到的,但即使只有 2 个数组的第一个元素匹配,这个 return 也是正确的。

for (int i=0; i<size1; i++)

{

for (int j = 0; j<size2; j++)

{

if(arr1[i] == arr2[j])

{

printf("found a match %d", j);

break;

}

else if (arr1[i] != arr2[j])

{

printf("not match");

break;

}

完整代码如下:-

#include <stdio.h>
#include <string.h>

int main()
{
    int arr1[] = {1, 2, 4, 2, 2, 2, 1, 1, 2, 4, 3, 4, 4, 1, 2, 4, 4, 1, 3, 3};
    int size1 = (int) (sizeof(arr1)/sizeof(arr1));
    
    int arr2[] = {1, 2, 4};
 
 
 
    int size2 = (int) (sizeof(arr2)/sizeof(arr2[0]));

       int match = 0;        
        for (int i=0; i<size1; i++)      
        {
    
            for (int j = 0; j < size2; j++) {
    
                if (arr1[i] != arr2[j]) {
                    match = 1;
                    break;
    
                }
            }
        }
        if(match == 1){
            printf("Not a match");
        }else if(match == 0){
            printf("The lists match");
        }
        return 0;
}

如果你查看 arr1arr2,我需要一种方法来 return 索引 0,7,13 而且这仍然很粗糙,因为 arr2 在技术上是动态的,因为它是由用户分配的,没有固定大小,只有 arr1 会有固定大小。

此代码将 return 匹配两个列表中相同位置的每个字符。
所以如果你想验证整个列表,你应该设置一个整数,来识别是否有一个字符在两个列表中不匹配。
如果你想显示匹配的列表,你只需要在第二个 if 中打印整个列表。

        int match = 0;        
        for (int i=0; i<size1; i++)      
        {
    
            for (int j = 0; j < size2; j++) {
    
                if (arr1[i] != arr2[j]) {
                    match = 1;
                    break;
    
                }
            }
            if(match == 1){
                printf("Not a match");
            }else if(match == 0){
                printf("The lists match");
                printf("First character: %c", arr2[0]);
            }
            match = 0; 
        }
        

请您尝试以下操作:

#include <stdio.h>

int main()
{
    int arr1[] = {1, 2, 4, 2, 2, 2, 1, 1, 2, 4, 3, 4, 4, 1, 2, 4, 4, 1, 3, 3};
    int size1 = sizeof arr1 / sizeof arr1[0];

    int arr2[] = {1, 2, 4};
    int size2 = sizeof arr2 / sizeof arr2[0];

    int match;
    int i, j;

    for (i = 0; i < size1 - size2 + 1; i++) {
        match = 0;
        for (j = 0; j < size2; j++) {
            if (arr1[i + j] != arr2[j]) {
                match = 1;
                break;
            }
        }
        if (! match) {
            printf("matched at %d\n", i);
        }
    }
    return 0;
}

它将输出:

matched at 0
matched at 7
matched at 13

如果要将数组赋给匹配索引列表,修改代码会很容易。

您的问题类似于在字符串中查找子字符串。但是字符被替换为整数。

这是一个可以找到匹配项的程序。它有一些调试打印语句来展示它是如何工作的。

#include <stdio.h>
int g_Arr2_Changed=0; //----Global boolean if arr2 changes.
int main(int argc, const char *argv[])
{ int arr1[] = {1, 2, 4, 2, 2, 2, 1, 1, 2, 4, 3, 4, 4, 1, 2, 4, 4, 1, 3, 3};
  int size1 = (int) (sizeof(arr1)/sizeof(int));
  int arr2[] = {1, 2, 4};
  int size2 = (int) (sizeof(arr2)/sizeof(int));
  int patternStart  = -1; //----Start pattern in arr1.
  int nPatternMatch =  0; //----Number of ints matched so far.
  for (int i=0; i<size1; i++)
  { int checkInt = arr1[i];
    //printf("[%i](%i)", i, checkInt);
    if (nPatternMatch == 0) //----No integers are matched yet.
    { //printf("<None>");
      //----Is checkInt the start of arr2?
      if (arr2[nPatternMatch] == checkInt)
      { patternStart=i; nPatternMatch++; //printf("<start>");
      }
    }
    else //----At least one integer has been matched already.
    { //printf("<Some>");
      //----Is checkInt a continuation?
      if (arr2[nPatternMatch] == checkInt)
      { nPatternMatch++; //----Matched another integer.
        //printf("<matched>");
      }
      else
      { //printf("<NotMatched>");
        i = patternStart; //---- for() will add one.
        patternStart = - 1;
        nPatternMatch = 0; //----Not match. Start at next int.
      }
    }
    //----If match found print and reset for next.
    if (nPatternMatch == size2)
    { printf("Pattern found at %i\n", patternStart);
      i = patternStart + 1;
      patternStart = -1; nPatternMatch = 0;
    }
    //----Just in case the global variable says arr2 changed.
    if (g_Arr2_Changed != 0) //----Start over.
    { //printf("<arr2 changed.>");
      i=0; patternStart = -1; nPatternMatch = 0;
      size2 = (int) (sizeof(arr2)/sizeof(int));
    }
    //printf("\n");
  }
  return 0;
}