首页 > 解决方案 > 了解为什么它在数组中找不到重复项

问题描述

我在 C 中编写了以下函数:

int last(long arr[], int length) {
   for (int i = 0; i < length-1; i++)
       if (*(arr+i) == *(arr + length - 1)) 
           return 1;
   return 0;
}

它检查数组的最后一个值是否被多次使用。主要是:

int *arr = malloc(length*sizeof(int));
for (int i = 0; i < length; i++) 
   scanf("%d", ++arr);
printf(last((long *) arr, length);

由于数组的某种原因,[1,2,2,3]它返回最后一个元素被多次使用,我不知道为什么。我认为这是因为scanf("%d", ++arr);但我不知道如何解决它。我的目标是它将返回1for[1,3,2,3]0for [1,2,2,3]。可能是什么问题呢?

标签: carrays

解决方案


你应该使用scanf("%d", &arr[i]);. Using++arr会导致数组在传递给 之前递增last,并且还会读入超出 的数据arr,这是未定义的行为。

另一个问题是演员阵容long *

您应该使用%ldinscanflong *arr = malloc(length*sizeof(*arr));.

还要确保检查NULL. 你永远不知道什么时候malloc会失败或有人会传递不良数据。

完整示例:

#include <stdio.h>
#include <stdlib.h>

int last(long arr[], int length) {
   if(!arr) return -1;
   for (int i = 0; i < length-1; i++)
   {
       if (arr[i] == arr[length-1])
           return 1;
   }
   return 0;
}

int main(void)
{
    long *arr = malloc(4*sizeof(*arr));
    if(!arr) return 1;
    for (int i = 0; i < 4; i++) 
        scanf("%ld", &arr[i]);
    printf("%d\n", last(arr, 4));
}

推荐阅读