字符串数组排序(C语言)(qsort库函数)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串数组排序(C语言)(qsort库函数)相关的知识,希望对你有一定的参考价值。
for(i=1;i<=n;i++)
scanf("%s",f[i]);
怎么使用库函数qsort对F[I]进行排序?要求长度短的在前,长度相同的以首字符排序(字符串中只存在0~9十个数字)
声明一个字符串指针数组存放每个字符串的首地址,调用库函数qusort按题目要求对字符串指针排序,不移动源字符串。关键是要设计一个好的比较函数,精巧地解决“按长度、长度相等时按大小”排序的问题。举例代码如下:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define N 10 //字符串个数
#define LN 21 //限制字符串长度为20
int mycmp(const void *a,const void *b)//比较函数
char *pa=*(char **)a,*pb=*(char **)b;
int x=int(strlen(pa)-strlen(pb));//依长度比较
return x ? x : strcmp(pa,pb);//长度相等时依大小比较
int main(void)
int i=0,j=0;
char *f[N],w[LN*N];//声明指针数组f和字符串总空间
printf("Input %d string(s)(length<=%d)...\\n",N,LN);
while(i<N)//输入并将字符串首址赋给f[i]
if(scanf(" %[1234567890]",f[i]=w+j)>0 && strlen(f[i])<LN)
i++,j+=LN;
else printf("Error, redo: Required length less than %d:",LN);
qsort(f,N,sizeof(char *),mycmp);//调用库函数对字符串指针排序
for(i=0;i<N;printf("%s\\n",f[i++]));//输出...
return 0;
参考技术A qsort是通过你自己的比较函数进行排序,也就是说你必须自己写比较函数,两个字符窜的比较,然后按照qsort的格式填进去,调用函数快速排序就可以了。假设width为每个字符串长度,compare_fun为比较函数,则:qsort(&f[0],10,width,compare_fun);
但是qsort函数的定义:void qsort(
void *base,
size_t num,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
第三个参数是每个元素的长度,对于不是定长的字符串是无法比较的(好像是这样的,变长的我没有试过。。你也可以试一试用sizeof)。所以最多能够进行等长的字符串比较。相信比较函数楼主能够自己完成。 参考技术B #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5
#define SIZE 100
int cmpOne(const void *a, const void *b)
char *p = (char *)a;
char *q = (char *)b;
int m = strlen(p);
int n = strlen(q);
if (m != n)
return (m - n);//按串长排序,由小到大
else
return (*p - *q);//按首字母排序,由小到大
void main(void)
int i;
char str[SIZE][SIZE];
for (i=0; i<N; i++)
scanf("%s", str[i]);
qsort(str, N, SIZE, cmpOne);
for (i=0; i<N; i++)
puts(str[i]);
printf("\n");
参考技术C 假设一个字符串最大长度100
qsort(f,n,sizeof(char)*100,comp);
int comp(const void *a,const void *b )
if(strlen((char*)a)<strlen((char*)b))
return 1;
else if(strlen((char*)a)==strlen((char*)b))
return strcmp((char*)a,(char*)b));
else
return 0;
//没经过验证 参考技术D 新鲜出炉:
#include "stdio.h"
#include "string.h"
#include <stdlib.h>
#define N 5 /*字符串个数*/
#define MAXLEN 30 /*字符串最大长度*/
int CompareStrLen( const void * s1, const void * s2)
char * r1, * r2;
r1 = (char *)s1;
r2 = (char *)s2;
/*比较字符串长度*/
if (strlen(r1)>strlen(r2))
return 1;
else if (strlen(r1) < strlen(r2))
return -1;
else
return 0;
int CompareHeaderChar(const void * s1, const void * s2)
char * r1, * r2;
r1 = (char *)s1;
r2 = (char *)s2;
//比较首字母
if (*r1 > *r2)
return 1;
else if ( *r1 < *r2)
return -1;
else
return 0;
int main()
const int n=N;
char f[n][MAXLEN];
int k=0, numOfSamelength=1;
/*输入*/
for(int i=0;i<n;i++)
printf("输入一串数字:");
scanf("%s",f[i]);
/*根据字串长度排序*/
qsort((void *)f, n, sizeof(char [MAXLEN]), CompareStrLen);
printf("\n按照长度排序的结果:\n");
for(i=0;i<n;i++)
printf("输出:");
printf("%s\n",f[i]);
/*相同长度,根据首字母排序*/
do
while( (k<n-1) && (strlen(f[k]) == strlen(f[k+1])))/*计算相邻具有相同长度的字串的个数*/
numOfSamelength ++;
k++;
/*把字符串数组按照相同长度的一段,根据首字符进行排序*/
qsort((void *)(f+k-numOfSamelength+1), numOfSamelength, sizeof(char [MAXLEN]), CompareHeaderChar);
/*下一段开始,初始化计数器*/
numOfSamelength=1;
k++; /*下一段字符串对应的下标*/
while (k<n);
printf("\n长度相同字符串按首字符排序的结果:\n");
for(i=0;i<n;i++)
printf("输出:");
printf("%s\n",f[i]);
return 0;
/* 运行结果:
输入一串数字:1
输入一串数字:8
输入一串数字:28456
输入一串数字:52
输入一串数字:25
按照长度排序的结果:
输出:8
输出:1
输出:52
输出:25
输出:28456
长度相同字符串按首字符排序的结果:
输出:1
输出:8
输出:25
输出:52
输出:28456
*/本回答被提问者和网友采纳
以上是关于字符串数组排序(C语言)(qsort库函数)的主要内容,如果未能解决你的问题,请参考以下文章
C语言篇 + 指针进阶练习 + qsort模拟实现(回调函数思想) + 指针和数组笔试题
C语言中利用qsort函数对字符串数组按ASC码进行排序并输出、