10802:带回调的条件计数
题目
实现 count_if_i32,按顺序调用谓词并统计返回 true 的元素数量。无效参数必须被拒绝,失败时输出对象保持不变。
解析
先验证所有参数,再开始遍历。结果先保存在局部对象中,只有完整遍历成功后才写入 *out_count,这样所有失败分支都不会破坏调用方原有结果。
count == 0 时不进入循环,因此 items == NULL 是安全且有明确定义的。predicate 和 out_count 即使在空数组情况下也必须有效,因为它们属于接口本身的必要组成部分。
解析
c
#include <stdbool.h>
#include <stddef.h>
typedef bool (*IntPredicate)(int value);
bool count_if_i32(
const int *items,
size_t count,
IntPredicate predicate,
size_t *out_count
) {
if (predicate == NULL || out_count == NULL) {
return false;
}
if (count > 0 && items == NULL) {
return false;
}
size_t result = 0;
const int *current = items;
for (size_t remaining = count; remaining > 0; --remaining) {
if (predicate(*current)) {
++result;
}
++current;
}
*out_count = result;
return true;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31