字符串数组排序(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;
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-24
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)。所以最多能够进行等长的字符串比较。相信比较函数楼主能够自己完成。
第2个回答  2011-09-24
#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");
}
第3个回答  2011-09-24
假设一个字符串最大长度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;     
}
//没经过验证
第4个回答  推荐于2018-03-12
新鲜出炉:
#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

*/本回答被提问者和网友采纳
相似回答