c - 函数不会打印特定列表
问题描述
我被要求定义一个函数,接收列表的值并将其元素分配到两个列表中:一个用于奇数,另一个用于偶数。我已经创建了函数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
我的错误在哪里?
解决方案
正如评论中所指出的,您的代码并没有按照您的想法执行:
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 总是会问数组及其大小。
推荐阅读
- laravel - `morphTo` 方法的第一个参数的用例是什么?
- html - 如何更改 p-checkbox css 样式?
- python - How to add description to the User Change Page in Django Admin
- excel - 如何使用数据透视表值在 MS Excel 中应用条件格式公式?
- shell - 每次在文件中增加一个列值
- xamarin.forms - 在 XF Prims 上,如何将 Master Page Viewmodel 传递给 MasterDetailPage 的 ViewModel,以便我可以换出详细信息页面
- rest - PayPal 智能支付按钮与服务器端 REST API 集成
- python - 如何将字符串与中间的任何单词匹配,并将其存储为变量?
- r - 我怎样才能让 R 的输出更详细,以便让我放心它还没有坏掉?
- sql - 访问报告混乱