字符串数组排序(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 "stdafx.h"//If the vc++6.0, with this line.
#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码进行排序并输出、

C语言标准库函数qsort详解

如何用c语言给输入的二维数组每一行排序

【C语言】如果想用qsort这样的系统自带函数给一个二维数组的某一横行排序怎么做?

CGO实战-封装qsort函数