我编写了一个函数,创建一个随机值的动态数组,另一个函数创建一个由前一个数组的唯一值组成的新数组。使用的算法正确计算唯一值。但是,我在打印所有值时遇到了问题。在下面的示例中,程序打印了 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++;
关于c - 在 C 中打印数组的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62488392/