首页 > 解决方案 > 函数不会打印特定列表

问题描述

我被要求定义一个函数,接收列表的值并将其元素分配到两个列表中:一个用于奇数,另一个用于偶数。我已经创建了函数array_oddeven()并传递了两个参数:

int *ptr: 指向数组的指针

int length: 表示数组的大小

并在里面调用它int main()

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#define UPPER_BOUND 8
#define MAX  100
#define SIZE  12

void array_print(int *ptr, int length) {
    for (int i = 0; i < length; i++) {
        printf("%d ", ptr[i]);
    }
    printf("\n");
}

int* array_create(int length) {
    int *t = (int*)malloc(length * sizeof(int));
    for (int i = 0; i < length; i++) {
        t[i] = rand() % MAX;
    }

    return t;
}

int *array_oddeven(int *ptr, int length){
    int *even = (int*)malloc(length * sizeof(int));
    int *odd = (int*)malloc(length * sizeof(int));
    int j=0;
    int k=0;
    for (int i = 0; i < length; i++)
    {
        if (ptr[i] % 2 == 0) {
            even[j] = ptr[i];
            j++;
        } else {
            odd[k] = ptr[i];
            k++;
        }
    } 
    return even, odd;
}

int main()
 {
    int *t = array_create(SIZE);
    int *even = array_oddeven(t, SIZE);
    int *odd = array_oddeven(t, SIZE);
    array_print(t, SIZE);
    array_print(even, SIZE);
    array_print(odd, SIZE);
    free(odd);
    free(even);
    free(t);
    return 0;
}

我期待这个结果:

83 86 77 15 93 35 86 92 49 21 62 27 
83 77 15 93 35 49 21 27 
86 86 92 62

但我得到了这个输出:

83 86 77 15 93 35 86 92 49 21 62 27 
83 77 15 93 35 49 21 27 0 0 0 0 
83 77 15 93 35 49 21 27 0 0 0 0 

我的错误在哪里?

标签: carrays

解决方案


正如评论中所指出的,您的代码并没有按照您的想法执行: return even, odd;使用逗号运算符逗号运算符的作用是什么?

事实上,它不会返回两个值,而只返回一个。

如果要检索两个数组,可以将返回值作为函数的输入参数传递;这是我的样子:

void array_oddeven(const int *ptr, int length, int **podd, int **peven){
    /* fill both arrays with 0 as your print function go thru the whole
     * lenght of elements */
    int *even = calloc(length, sizeof(int));
    int *odd = calloc(length, sizeof(int));
    int j=0;
    int k=0;
    for (int i = 0; i < length; i++)
    {
        if (ptr[i] % 2 == 0) {
            even[j] = ptr[i];
            j++;
        } else {
            odd[k] = ptr[i];
            k++;
        }
    }
    *peven = even;
    *podd = odd;
}

int main()
 {
    int *t = array_create(SIZE);
    int *even;
    int *odd;
    array_oddeven(t, SIZE, &odd, &even);
    array_print(t, SIZE);
    array_print(even, SIZE);
    array_print(odd, SIZE);
    free(odd);
    free(even);
    free(t);
    return 0;
}

值得注意的是,您随后返回“未知”大小的数组,因为您对偶数/奇数元素的数量知之甚少,因此您可能会以相同的方式传递元素的输出数量:

void array_oddeven(const int *ptr, int length, int **podd, size_t *poddnumelts,
                                               int **peven, size_t *pevennumelts) {
    /* malloc is back here as the array does not require to be filled with
     * zeros as we return the number of elements that were set */
    int *even = malloc(length * sizeof(int));
    int *odd = malloc(length * sizeof(int));
    int j = 0;
    int k = 0;
    for (int i = 0; i < length; i++)
    {
        if (ptr[i] % 2 == 0) {
            even[j] = ptr[i];
            j++;
        } else {
            odd[k] = ptr[i];
            k++;
        }
    }
    *peven = even;
    *pevennumelts = j;
    *podd = odd;
    *poddnumelts = k;
}

int main()
 {
    int *t = array_create(SIZE);
    int *even, *odd;
    size_t oddnumelts, evennumelts;
    array_oddeven(t, SIZE, &odd, &oddnumelts, &even, &evennumelts);
    array_print(t, SIZE);
    array_print(even, evennumelts);
    array_print(odd, oddnumelts);
    free(odd);
    free(even);
    free(t);
    return 0;
}

以更一般的方式,您可以认为将没有大小的数组传递给函数可以被认为是可疑的(在 C 中),因为以后无法“猜测”它,因此“正常”API 总是会问数组及其大小。


推荐阅读