代码不会检查一维数组中的多个重复整数

时间:2015-03-24 17:18:50

标签: c arrays

我编译了一个代码来检查一维数组中的重复项,我唯一的问题是它会显示一个副本,而不是其他副本。我已经包含了我的代码。我是一个新手,我努力做到这一点。

这是我的代码:

#include <stdio.h>
#include <malloc.h>

void duplicate(int array[], int num)
{
    int *count = (int *)calloc(sizeof(int), (num - 2));
    int i;

    printf(" The duplicate integers in this array are: ");
    for (i = 0; i < num; i++)
    {
        if (count[array[i]] == 1)

            printf(" %d ", array[i]);

        else

            count[array[i]]++;

    }
}

int main()
{
    int array[] = {7, 77, 42, 2, 1, 4, 2, 7, 42};
    int array_freq = sizeof(array) / sizeof(array[0]);

    duplicate(array, array_freq);

    getchar();


    return 0;
}

2 个答案:

答案 0 :(得分:0)

方式超出count数组的范围,执行count[array[i]]意味着您使用e,g,array[1]作为索引count数组,array[1]77,这意味着您使用77作为count的索引,只有7个条目。

这当然会导致undefined behavior

答案 1 :(得分:0)

除了@JoachimPileborg在他的回答中指出的关于访问count越界的问题之外,我认为你没有正确的逻辑来检查重复项。

让我们从array7的第一个元素开始。

检查以后是否找到7。找到后,打印重复项。

然后请注意您已检查7的重复项。在迭代7时遇到array时,您不必再次检查7的重复项。

void duplicate(int array[], int num)
{
   int i;
   int j;
   int* status = calloc(sizeof(int), num);

   printf(" The duplicate integers in this array are: ");
   for (i = 0; i < num; i++)
   {
      if ( status[i] == 1 )
      {
         // Already visited and marked as duplicate
         // Go on to the next item.
         continue;
      }

      for ( j = i+1; j < num; ++j )
      {
         if (array[i] == array[j])
         {
            // Note that array[j] has already been visited and
            // marked as a duplicate.
            status[j] = 1;

            // If array[i] is not already printed, print it and
            // mark it as a duplicate.
            if ( status[i] == 0 )
            {
               printf(" %d ", array[i]);
               status[i] = 1;
            }
         }
      }
   }

   printf("\n");

   // Make sure to deallocate the memory before returning from
   // the function.
   free(status);
}