在 C 中打印数组的唯一值

Printing unique values of the array in C

我写了一个函数创建随机值的动态数组,另一个函数创建一个新数组,该新数组由前一个数组的唯一值组成。使用的算法正确计算唯一值。但是,我在打印所有值时遇到了问题。在下面的示例中,程序打印了 7 2 12714320 4 5 而不是 7 2 4 5 6 .

这是可以测试的程序:

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

int *delduplicate(int *v, int size_old, int *size_new);

main()
{
    int n;
    int *norepeat;
    float *results;
    int dim, size_norepeat, i;
    
    int a[7] = {7,2,2,4,5,6,7};
    
    norepeat = delduplicate(a, 7, &size_norepeat);
    
    for (int i = 0; i < size_norepeat; i++)
        printf("%d ", norepeat[i]);
}



// delduplicate function
int *delduplicate(int *v, int size_old, int *size_new)
{
    int i, j, k = 1, uniques = 1, repeats, *new_v, temp;
    
    // count the number of unique elements
    for (i = 1; i < size_old; i++)
    {
        int is_unique = 1;
        
        for (j = 0; is_unique && j < i; j++)
        {
            if (v[i] == v[j])
                is_unique = 0;          
        }
        
        if (is_unique)
            uniques++;
    }
    
    *size_new = uniques;
    
    // create new array of unique elements
    new_v = (int*) malloc(*size_new * sizeof(int));
    
    // fill new array with unique elements
    new_v[0] = v[0];
    
    for (i = 1; i < size_old; i++)
    {
        int is_unique = 1;
            
        for (j = 0; j < i; j++)
        {
            if (v[i] == v[j])
                is_unique = 0;
        }
    
        if (is_unique)
            new_v[k] = v[i];
            k++;
            
    }
    return new_v;
}

问题应该出在这里:

// fill new array with unique elements
new_v[0] = v[0];

for (i = 1; i < size_old; i++)
{
    int is_unique = 1;
        
    for (j = 0; j < i; j++)
    {
        if (v[i] == v[j])
            is_unique = 0;
    }

    if (is_unique)
        new_v[k] = v[i];
        k++;       
}

您的问题可能出现在以下部分-

if (is_unique)
    new_v[k] = v[i];
    k++;

在这里,您在每次迭代时递增 k。但是,您只想在找到唯一元素时递增它。 if() 没有括号只考虑第一条语句。所以把它改成这个 -

if (is_unique){
    new_v[k] = v[i];
    k++;
}

此更改应该会使您的程序 运行 正常。


旁注: 如果您不想对 if()for() 等使用方括号,您可以用逗号和在没有括号的情况下使用。像这样-

if (is_unique)
    new_v[k] = v[i],
    k++;