我必须用签名
编写一个函数 int *greater (int n[], int length, int value)
返回指向包含n []中元素大于值的数组的指针。返回的数组必须完全是保持值大于value的长度,并且没有未使用的元素。
我有以下代码:
#include <stdio.h>
int k=0, v[100];
int * greater(int n[], int length, int value)
{
for (int i=0; i<length-1; i++)
if (n[i]>value)
{
v[k]=n[i];
k++;
}
int *p=v;
return p;
}
int main ()
{
int a[]={1,2,3,4,5};
int *p=greater (a,5,3);
int *end; end=v+k;
while (p<=end)
{
printf ("%i ", *p);
p++;
}
}
问题是p只会保持4的值,因此它会打印4 0而不是4 5.任何想法我做错了什么?
答案 0 :(得分:2)
要解决您的问题,请不要使用全局数组(v[100];
)。相反,
答案 1 :(得分:0)
除了已经提到的更改之外,我建议进行2次更改:
将for loop
迭代到<length
,因为<legnth-1
不会覆盖整个数组。
int * greater(int n[], int length, int value)
{
for (int i=0; i<length; i++)
if (n[i]>value)
{
v[k]=n[i];
k++; // increment
}
int *p=v;
return p;
}
另外,更改结束的公式。这是因为在函数中,增量发生时,k=0
将更改为k=1
的{{1}},4 > 3
的{{1}}。现在,
k=2
会导致5 > 3
,而我们想要一个较小的值。
end = v + k ;
答案 2 :(得分:0)
由于规范不需要返回目标数组的大小,在函数内部分配一个新数组会使指针返回安静无用,因为调用者不知道哪些元素(如果有的话)是有效的。
所以唯一合理的方法是不为目标分配内存,甚至不使用第二个数组。这也不是规范要求,因此您可能希望采用以下方法
示例:
#include <qsort.h>
int cmp(const void * pv1, const void * pv2)
{
int i1 = *((int *) pv1);
int i2 = *((int *) pv2);
return (i1 - i2);
}
int * greater(int n[], int length, int value)
{
qsort(n, sizeof *n, length, cmp);
while (0 < length)
{
--length;
if (n[length] > value)
{
break;
}
}
return n + length + 1;
}
唯一的要求/
返回的数组必须正好是保持值大于值
的长度
满足。
答案 3 :(得分:0)
修改搜索功能以返回指针参数中找到的元素数。在函数中分配结果数组,最小化函数中可能的分配数量,在返回之前收缩结果数组。
例如:
#include <stdio.h>
#include <stdlib.h>
int *
greater(
const int const n[],
const size_t n_elem,
const int threshold,
size_t *n_greater
)
{
size_t i = 0;
size_t n_found = 0;
size_t n_allocated = 0;
int *ret = NULL;
for (i = 0; i < n_elem; i += 1) {
if (n[i] > threshold) {
n_found += 1;
if (n_found > n_allocated) {
size_t new_size = (n_allocated < (n_elem / 2))
? 2 * n_found
: n_elem
;
int *tmp = realloc(ret, new_size * sizeof(*tmp));
if (!tmp) {
fputs("Failed to allocate memory", stderr);
exit(EXIT_FAILURE);
}
n_allocated = new_size;
ret = tmp;
}
ret[n_found - 1] = n[i];
}
}
if (n_allocated > n_found) {
int *tmp = realloc(ret, n_found * sizeof(*tmp));
if (!tmp) {
fputs("Failed to shrink result array", stderr);
exit(EXIT_FAILURE);
}
ret = tmp;
}
*n_greater = n_found;
return ret;
}
int main (void)
{
int a[] = {1,2,3,4,5,1,1,2,3,7,6,5,5,0,-1,7};
size_t n_greater_than_three = 0;
size_t i =0;
int *p = greater(a, sizeof(a)/sizeof(a[0]), 3, &n_greater_than_three);
for (i = 0; i < n_greater_than_three; i += 1) {
printf("%d\n", p[i]);
}
free(p);
return EXIT_SUCCESS;
}
输出:
C:\...\Temp> greater.exe 4 5 7 6 5 5 7