在字符串数组上使用C中的qsort

在字符串数组上使用C中的qsort,c,arrays,sorting,qsort,C,Arrays,Sorting,Qsort,我不知道如何使用qsort。我想对字符串数组进行排序。像这样: John Adam Adam -> John Stacy Stacy 然而,我所做的一切似乎都不管用。我试着完全复制其他人使用过的东西(来自不同来源的大约5个不同的qsort函数),但没有任何效果。我有一个int的工作(向后,但至少它的工作) 以下是我拥有的必要代码: #include <stdio.h> #include <string

我不知道如何使用qsort。我想对字符串数组进行排序。像这样:

John              Adam
Adam      ->      John
Stacy             Stacy
然而,我所做的一切似乎都不管用。我试着完全复制其他人使用过的东西(来自不同来源的大约5个不同的qsort函数),但没有任何效果。我有一个int的工作(向后,但至少它的工作)

以下是我拥有的必要代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
char name[80];
int age;
} RECORD;
RECORD record[25];

int main (int argc, char *argv[80]){     // Using command line to get my strings

    int i = 2, j;
    for(j = 0; j < (argc / 2); j++)      //Converting and storing my ages
    {
        record[j].age = atoi(argv[i]);
        i = i + 2;
    }

    int p, q = 1;
    for(p = 0; p < (argc / 2); p++)
    {
        strcpy(record[p].name, argv[q]);
        q = q + 2;
    }
}

int compareByName(const void* a, const void* b) //The qsort that doesn't work at all
{
    const char *ia = (const char *)a;
    const char *ib = (const char *)b;

    return strncmp(ia, ib, 25);
}

int compareByAge (const void * a, const void * b)  //My other qsort that works backwards
{

    RECORD *RECORDA = (RECORD *)a;
    RECORD *RECORDB = (RECORD *)b;

    return ( RECORDB->age - RECORDA->age );
}

void printRecords(RECORD r[], int num){
//printing stuff here

double size = sizeof r[0];
double count = sizeof(r)/size;          //My qsort with size stuff, doesn't work
qsort(r, count, size, compareByName);   // if I do it the same as the other  

qsort (r, 25, sizeof(RECORD), compareByAge);   //My other qsort that works backwards

//more printing stuff here
}
#包括
#包括
#包括
类型定义结构{
字符名[80];
智力年龄;
}记录;
记录[25];
intmain(intargc,char*argv[80]){//使用命令行获取我的字符串
int i=2,j;
对于(j=0;j<(argc/2);j++)//转换和存储我的年龄
{
记录[j].age=atoi(argv[i]);
i=i+2;
}
int p,q=1;
对于(p=0;p<(argc/2);p++)
{
strcpy(记录[p].name,argv[q]);
q=q+2;
}
}
int compareByName(const void*a,const void*b)//完全不起作用的qsort
{
常量字符*ia=(常量字符*)a;
常量字符*ib=(常量字符*)b;
返回strncmp(ia,ib,25);
}
int compareByAge(const void*a,const void*b)//我的另一个反向工作的qsort
{
记录*记录a=(记录*)a;
记录*记录b=(记录*)b;
返回(RECORDB->age-RECORDA->age);
}
作废打印记录(记录r[],整数){
//在这里打印东西
双尺寸=r[0]的尺寸;
double count=sizeof(r)/size;//我对大小的排序不起作用
qsort(r,count,size,compareByName);//如果我和其他人一样做的话
qsort(r,25,sizeof(RECORD),compareByAge);//我的另一个反向工作的qsort
//这里有更多的印刷品
}

您没有字符串数组,您有一个
记录的数组,听起来您想根据记录的
名称
数组中的字符串对该数组进行排序。所以你想要的是:

int compareByName(const void *a_, const void *b_) {
    RECORD *a = a_, *b = b_;

    return strcmp(a->name, b->name);
}
然后你就用

qsort (r, 25, sizeof(RECORD), compareByName);

你没有字符串数组,你有一个
RECORD
s数组,听起来你想根据
name
记录数组中的字符串对数组进行排序。所以你想要的是:

int compareByName(const void *a_, const void *b_) {
    RECORD *a = a_, *b = b_;

    return strcmp(a->name, b->name);
}
然后你就用

qsort (r, 25, sizeof(RECORD), compareByName);

好的,我看到了几个问题

值得注意的是,
sizeof
是在编译时计算的,因此不能使用
sizeof(r)
来确定传递的动态大小数组的大小。我想这就是为什么
num
被传递到
printRecords
的原因

正如@Chris指出的,您正在排序
RECORD
结构,而不是字符指针,因此比较函数和
qsort
调用都需要考虑这一点


在年龄比较中,减法是反向的-如果左侧小于右侧,则需要返回负数,因此使用
RECORDA->age-RECORDB->age
好的,我在这里看到了几个问题

值得注意的是,
sizeof
是在编译时计算的,因此不能使用
sizeof(r)
来确定传递的动态大小数组的大小。我想这就是为什么
num
被传递到
printRecords
的原因

正如@Chris指出的,您正在排序
RECORD
结构,而不是字符指针,因此比较函数和
qsort
调用都需要考虑这一点

在年龄比较中,减法是反向的-如果左侧小于右侧,则需要返回负数,因此首先使用
RECORDA->age-RECORDB->age

(这就是字符串不排序的原因),
double count=sizeof(r)/size是错误的。sizeof(r)并没有达到您期望的效果。您需要将数组的大小传递给printRecords(),如本问题所述:

其次,
int-compareByAge(const-void*a,const-void*b)//我的另一个反向工作的qsort
是反向的,因为您是反向执行的。比较器函数总是返回A-B,而不是B-A。

首先(这就是字符串不排序的原因),
double count=sizeof(r)/size是错误的。sizeof(r)并没有达到您期望的效果。您需要将数组的大小传递给printRecords(),如本问题所述:

其次,
int-compareByAge(const-void*a,const-void*b)//我的另一个反向工作的qsort
是反向的,因为您是反向执行的。比较器函数总是返回A-B,而不是B-A。

不是说年龄可能溢出,而是为了避免溢出,请使用
(RECORDB->age>RECORDA->age)-(RECORDB->ageage)
不是说年龄可能溢出,而是为了避免溢出,请使用
(RECORDB->age>RECORDA->age)-(RECORDB->ageage)
谢谢,我修复了问题的大小。当我将
RECORDB->age-RECORDA->age
替换为
RECORDA->age-RECORDB->age
时,qsort完全停止工作,并为我的打印功能提供空白数据。我现在工作的名字qsort也是一样。如果我尝试以正确的方式翻转它们,它们会给出空白数据。谢谢,我修复了问题的大小。当我将
RECORDB->age-RECORDA->age
替换为
RECORDA->age-RECORDB->age
时,qsort完全停止工作,并为我的打印功能提供空白数据。我现在工作的名字qsort也是一样。如果我尝试以正确的方式翻转它们,它们会给出空白数据。