我被要求创建一个没有来自数组的重复整数的新数组。
我认为我在代码中犯了一个错误,但却没有发现任何错误。
" 1,2,1,2,1,4和34的输出;是" 1,2,2,4"。
它应该是" 1,2,4"
想了解我的错误。
// Exercise 2 -
void Ex2() {
int i, counter = 1, size = -1;
int* array = input_dynamic_array(&size);
int* newArr = (int*)malloc((size)* sizeof(int));
newArr[0] = array[0];
assert(array);
for (i = 1; i < size; i++) {
if (!find_num_in_newArr(newArr, size, array[i])) {
newArr[counter++] = array[i];
}
}
newArr = (int*)realloc(newArr, (counter)*sizeof(int));
printArray(newArr, counter);
free(array);
free(newArr);
}
bool find_num_in_newArr(int *newArr, int size, int num) {
int i;
for (i = 0; i < size; i++) {
if (newArr[i] == num) {
return true;
}
return false;
}
}
int* input_dynamic_array(int *size)
{
int *array;
int ii;
printf("Enter array size: ");
scanf("%d", size);
array = (int*)malloc((*size) * sizeof(int));
assert(array);
printf("Enter %d integer numbers: ", *size);
for (ii = 0; ii < *size; ii++)
scanf("%d", array + ii);
return array;
}
答案 0 :(得分:4)
我在这里看到一个问题:
for (i = 0; i < size-1; i++)
{
if (newArr[i] == num)
{
return true;
}
return false;
}
这将永远不会有另一次迭代。它将从第一次迭代返回true
或false
。这不是你在使用循环时计划的内容。
根据您的设计,您可能希望将return false;
移出循环。
另一个建议,Don't cast the return value of malloc
, its pointless。
另外,
int* newArr = (int*)malloc((size)* sizeof(int));
这需要进行检查。您需要检查malloc
是否返回NULL
。如果是,则不分配内存,并且基于newArr
进行修改的任何内容都会非常糟糕。
相对更干净的方法包括使用如下所示的函数:
int RemoveDuplicates(int* Arr, int length)
{
int i = 0, j = 0;
int LengthChanged = 0;
for (i = 1; i < length; i++)
{
for(j = 0; j < LengthChanged ; j++)
{
if(Arr[i] == Arr[j])
break;
}
// Copy as is if there is not duplicate element in the array
if (j == LengthChanged )
Arr[LengthChanged++] = Arr[i];
}
return LengthChanged;
}
答案 1 :(得分:3)
您的代码中存在两个问题:
find_num_in_newArr
在第一次迭代时以return false;
退出循环。将return
语句移到循环体外。Ex2
检查整个数组是否有重复项,而不仅仅是已复制的部分:find_num_in_newArr(newArr, size, array[i])
应为find_num_in_newArr(newArr, i, array[i])
。如发布,此代码具有未定义的行为。这是一个带有一些额外断言的更正版本:
// Exercise 2 -
bool find_num_in_newArr(const int *newArr, int size, int num) {
int i;
for (i = 0; i < size; i++) {
if (newArr[i] == num) {
return true;
}
}
return false;
}
int *input_dynamic_array(int *size) {
int *array;
int ii;
printf("Enter array size: ");
assert(scanf("%d", size) == 1);
assert(*size > 0);
array = (int*)malloc((*size) * sizeof(int));
assert(array != NULL);
printf("Enter %d integer numbers: ", *size);
for (ii = 0; ii < *size; ii++) {
assert(scanf("%d", array + ii) == 1);
}
return array;
}
void Ex2(void) {
int i, counter, size;
int *array = input_dynamic_array(&size);
int *newArr = (int*)malloc(size * sizeof(int));
assert(newArr != NULL);
newArr[0] = array[0];
counter = 1;
for (i = 1; i < size; i++) {
if (!find_num_in_newArr(newArr, i, array[i])) {
newArr[counter++] = array[i];
}
}
newArr = (int*)realloc(newArr, counter * sizeof(int));
assert(newArr != NULL);
printArray(newArr, counter);
free(array);
free(newArr);
}
答案 2 :(得分:0)
你有点复杂了。
为索引使用正确的类型(size_t
)
int CheckValue(int *arr, int value, size_t size)
{
while (size--)
{
if (arr[size - 1] == value) return -1;
}
return 0;
}
int main()
{
int arr[] = {1,4,5,8,3,2,1,-1,9,-1,-1,6,8,1,5,4,2,3};
int newarr[sizeof(arr) / sizeof(arr[0])];
size_t size = 0;
for (size_t index = 0; index < sizeof(arr) / sizeof(arr[0]); index++)
{
if (!CheckValue(newarr, arr[index], size))
{
newarr[size++] = arr[index];
}
}
return 0;
}