在前端开发内容学习中,c语言 sort函数_用法和示例详解是常见主题。很多人在阅读时会遇到概念分散、步骤不清和注意点难以归纳的问题。本文按照基础概念、操作流程和关键细节,对相关内容进行整理。

很多人搜索c语言 sort函数,实际想解决的是C语言里怎样完成数组排序、该用什么函数、比较函数怎么写,以及常见报错该如何避免。本文用清晰示例把这些关键点一次讲明白。
标准C语言库里并没有名为sort的通用排序函数,实际开发中通常使用stdlib.h提供的qsort。很多资料口中的“C语言 sort函数”,本质上说的就是这个标准库排序接口。
如果你在C++里见过sort,那是algorithm中的模板函数,写法和C语言不同。只要是纯C代码,就应优先理解qsort的参数含义、比较函数规则,以及它适合处理哪些数据。
sort函数,纯C代码通常应使用qsort。qsort的核心思路很直接:把待排序数组的首地址、元素个数、单个元素大小,以及比较函数一起传进去,库函数就会按比较结果完成排序。
最容易出错的地方不是调用本身,而是比较函数。比较函数接收两个void指针,需要先转换成正确类型,再返回负数、零或正数,分别表示前者小于、等于或大于后者。
qsort原型
#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));base表示数组起始地址nmemb表示数组中的元素数量size表示每个元素占用的字节数,常写为sizeof(arr[0])compar表示比较函数,决定升序还是降序以及比较规则学习qsort最合适的入口就是整数数组,因为类型转换最清楚,也最容易看出比较函数的返回逻辑。下面这段代码可以直接完成升序排序,适合先跑通流程再迁移到结构体或字符串场景。
写整数比较函数时,不建议简单返回a-b。原因是当数值范围较大时,理论上可能出现溢出。更稳妥的写法是用条件表达式分别返回1、0、-1。
整数数组升序完整示例
#include <stdio.h>
#include <stdlib.h>
int cmp_int_asc(const void *a, const void *b) {
int x = *(const int *)a;
int y = *(const int *)b;
if (x > y) return 1;
if (x < y) return -1;
return 0;
}
int main(void) {
int arr[] = {42, 7, 19, 3, 25, 7};
int n = sizeof(arr) / sizeof(arr[0]);
qsort(arr, n, sizeof(arr[0]), cmp_int_asc);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("n");
return 0;
}cc -std=c11 demo.c -o demo./demo当排序对象不是整数,而是字符串或结构体数组时,思路仍然一样,变化只在比较函数。字符串通常用strcmp比较,结构体则根据某个字段决定顺序,比如成绩、年龄、价格或时间。
如果要给结构体排序,先明确排序依据,再在比较函数里取出两个结构体对象对应字段进行比较。规则一旦写清楚,qsort就能复用到大多数业务数据处理场景。
字符串数组排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp_str_asc(const void *a, const void *b) {
const char * const *s1 = (const char * const *)a;
const char * const *s2 = (const char * const *)b;
return strcmp(*s1, *s2);
}
int main(void) {
const char *words[] = {"pear", "apple", "orange", "banana"};
int n = sizeof(words) / sizeof(words[0]);
qsort(words, n, sizeof(words[0]), cmp_str_asc);
for (int i = 0; i < n; i++) {
printf("%sn", words[i]);
}
return 0;
}按成绩升序排序结构体数组
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[20];
int score;
} Student;
int cmp_student_score_asc(const void *a, const void *b) {
const Student *s1 = (const Student *)a;
const Student *s2 = (const Student *)b;
if (s1->score > s2->score) return 1;
if (s1->score < s2->score) return -1;
return 0;
}
int main(void) {
Student students[] = {
{"Tom", 82},
{"Lucy", 95},
{"Jack", 76},
{"Lily", 82}
};
int n = sizeof(students) / sizeof(students[0]);
qsort(students, n, sizeof(students[0]), cmp_student_score_asc);
for (int i = 0; i < n; i++) {
printf("%s %dn", students[i].name, students[i].score);
}
return 0;
}不少人觉得qsort难用,不是因为接口复杂,而是因为几个细节容易忽略。只要把头文件、元素大小、指针转换和比较规则逐项核对,多数问题都能很快定位。
真正影响结果正确性的,往往是比较函数写错类型,或者把字符串数组、结构体数组当成普通整型数组处理。排查时先用最小示例验证,再替换成自己的业务数据,会更稳妥。
错误写法
#include <stdio.h>
int main(void) {
int arr[] = {3, 1, 2};
qsort(arr, 3, sizeof(arr[0]), NULL);
return 0;
}stdlib.h。stdlib.h这个头文件,并传入有效比较函数。错误写法
int cmp_bad(const void *a, const void *b) {
const char *s1 = (const char *)a;
const char *s2 = (const char *)b;
return strcmp(s1, s2);
}错误写法
int arr[] = {9, 4, 7, 1};
qsort(arr, 4, sizeof(arr), cmp_int_asc);sizeof(arr)后传入的是整个数组大小。sizeof(arr[0])。如果你搜索的是c语言 sort函数,最关键的结论就是:标准C里没有通用sort函数,实际应使用qsort;如果你看到sort,多半是C++里的std::sort。先从整数数组示例入手,确认比较函数写法无误,再扩展到字符串和结构体,同时注意常见报错和适用边界,排序相关问题基本都能解决。