阵列组织(C编程)

时间:2016-02-06 18:34:42

标签: c

作为初学者,我在Visual Studio中遇到了一个错误,我无法弄清楚如何修复。

以下代码用于解决数组问题。数组内部会有重复的值,因此,程序必须删除它们并组织其余的数组,并返回数组的新大小。

例如:{1, 1, 2, 2, 5, 6, 8} ----> {1, 2, 5, 6, 8}

cup整数计算未组织数组中的NULL,并且稍后用于在组织内部切换值。

我得到的错误是:

**Warning C4047 '=': 'int' differs in levels of indirection from 'int *'**

**Warning C4047 '=': 'int' differs in levels of indirection from 'void *'** 

在线:232535(我在下面的代码中添加了行号)。

void main() {
    int a[] = { 1, 1, 1, 1, 2, 5, 6, 8, 8, 2, 5, 6, 2, 1, 8, 3 };
    int sizearr, i;

    sizearr = fixArr(a, sizeof(a));

    for (i = 0; i < sizearr; i++) {
        printf("%d ", a[i]);
    }
}

int fixArr(int *ptr, int size) {

    int arrS1, arrS2, cup;

    for (arrS1 = 0; arrS1 < (size--); arrS1++) {

        for (arrS2 = (arrS1++); arrS2 < size; arrS2++) {
                           //23
            if (*(ptr + arrS1) = (ptr + arrS2)) {
                cup++; //25
                *(ptr + arrS2) = NULL;
            }
        }
    }
    for (arrS1 = 0; arrS1 < cup; arrS1++) {

        for (arrS2 = 0; arrS2 < (size--); arrS2++) {
            // 35
            if (*(ptr + arrS2) = NULL) *(ptr + arrS2) = *(ptr + (arrS2++));
        }
    }
    return cup;
}

2 个答案:

答案 0 :(得分:0)

您的代码中存在以下几个问题:

  • sizeof(a)不评估a中的元素数,而是评估对象a所需的字节数。如果a是一个数组,则可以使用sizeof(a) / sizeof(a[0])获取元素的数量,但如果a是指针,则无法单独从a确定元素的数量。

  • NULL不是int的有效值,您不能将此方法用于int数组。

  • 您的比较不正确:您使用赋值运算符=而不是等于运算符==

  • 在从fixArr调用函数之前,您应该声明函数main

这是一个使用双指方法的更简单版本:使用一个索引进行迭代并将唯一元素与另一个索引存储在同一个数组中:

#include <stdio.h>

int fixArr(int *ptr, int size) {
    int i;  // index for reading (first finger)
    int j;  // index for writing (second finger)
    int k;  // index for searching duplicates

    for (i = j = 0; i < size; i++) {
        for (k = 0; k < j; k++) {
            if (ptr[k] == ptr[i])
                break;
        }
        if (k == j) {  // element ptr[i] was not found
            ptr[j] = ptr[i];  // copy new unique element
            j++;       // increment new element count
        }
    }
    return j;  // new size
}

int main(void) {
    int a[] = { 1, 1, 1, 1, 2, 5, 6, 8, 8, 2, 5, 6, 2, 1, 8, 3 };
    int size = sizeof(a) / sizeof(a[0]);
    int i, newsize;

    printf("original array:");
    for (i = 0; i < size; i++) {
        printf(" %d", a[i]);
    }
    printf("\n");

    newsize = fixArr(a, size);

    printf("fixed array:");
    for (i = 0; i < newsize; i++) {
        printf(" %d", a[i]);
    }
    printf("\n");
    return 0;
}

答案 1 :(得分:-1)

阅读你的代码我发现了很多错误,例如sizeof(a)没有返回数组的大小,因为在C中没有标准数组类型。只分配给指针的内存。因此,在您的情况下,sizeof(a)返回指针a的大小。这就是为什么你总是需要自己跟踪阵列的长度。

回到你的问题。我的简单解决方案是这样的:

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

int main(int argc, char *argv[]){
    int arr[] = {1,1,1,1,2,5,6,8,8,2,5,6,2,1,8,3};
    size_t len = 16;
    // create a new array with the same size as the original
    // since there is no guarantee all of the numbers
    // are not unique
    int *new_array = (int *)calloc(len, sizeof(int)), new_len = 0;

    // loop throught every number
    for (int i = 0; i < len; i++) {
        // if the current number, arr[i], is unique
        int unique = 1;
        // loop backwards to check if any of the previous
        // number are the same as the current one
        for (int j = i - 1; j > -1; j--) {
            // if the same number if found, set unique to 0
            // and break out of loop
            if (arr[i] == arr[j]) {
                unique = 0;
                break;
            }
        }
        // if looped all the way to index 0 without
        // finding the same number, add it to the last index
        // of our new array and increment it's size
        if (unique) {
            new_array[new_len] = arr[i];
            new_len++;
        }
    }
    // finally, if there have been found any duplicated,
    // adjust the memory allocated to the new_array pointer
    if (new_len < len) {
        new_array = (int *)realloc(new_array, sizeof(int) * new_len);
    }

    // when you're done using your new array,
    // free the memory allocated to it
    free(new_array);
    return 0;
}