C99中是否有标准函数可通过比较函数获取数组最小/最大元素?
C99中是否存在自定义比较的最小/最大元素获取函数?
嘿,好问题!C99标准库里并没有现成的、符合你描述的这种通过自定义比较函数获取数组最小/最大元素的标准函数。不过别担心,这个功能实现起来非常简单,而且逻辑和你预想的原型完全契合。
自己实现get_min函数
你可以基于C标准库的基础类型和指针操作,快速写出一个可移植的版本,和你给出的函数原型几乎一致:
#include <stddef.h> #include <string.h> void* get_min(void* start, size_t size, size_t elementSize, int (*compare)(const void *, const void*)) { // 处理空数组的边界情况 if (size == 0) { return NULL; } // 初始假设第一个元素是最小值 void* min_ptr = start; // 用unsigned char*遍历,确保能正确处理任意元素大小的步长 unsigned char* current = (unsigned char*)start + elementSize; for (size_t i = 1; i < size; ++i) { // 比较当前元素和当前最小值,若当前元素更小则更新指针 if (compare(current, min_ptr) < 0) { min_ptr = current; } current += elementSize; } return min_ptr; }
实现思路说明
- 用
unsigned char*来遍历数组是为了适配任意元素大小的步长,避免因指针类型导致的对齐或步长错误; - 比较函数的格式和
qsort的比较函数完全一致,这样可以复用你已经写好的、用于排序的比较逻辑; - 加入了空数组的边界处理,避免访问非法内存。
同理实现get_max
只需要修改比较判断的逻辑即可:
void* get_max(void* start, size_t size, size_t elementSize, int (*compare)(const void *, const void*)) { if (size == 0) return NULL; void* max_ptr = start; unsigned char* current = (unsigned char*)start + elementSize; for (size_t i = 1; i < size; ++i) { if (compare(current, max_ptr) > 0) { // 这里改成判断当前元素更大 max_ptr = current; } current += elementSize; } return max_ptr; }
补充说明
虽然C99标准里没有提供这类函数,但一些平台的扩展库(比如GNU的扩展)可能有类似实现,但为了代码的可移植性,自己实现是最稳妥的方式——毕竟逻辑简单,代码量也很小。
内容的提问来源于stack exchange,提问作者Daniel Meltzer
相关产品推荐
相关产品推荐

