在字符串数组

时间:2015-06-24 03:19:36

标签: c arrays sorting qsort

我无法弄清楚如何使用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
}

3 个答案:

答案 0 :(得分:4)

你没有一个字符串数组,你有一个RECORD数组,听起来你想根据记录的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);

答案 1 :(得分:1)

好的,我在这里看到了几个问题。

值得注意的是sizeof在编译时被评估,因此您无法使用sizeof(r)来确定传递的动态大小的数组的大小。我猜这就是num传递给printRecords的原因。

正如@Chris指出的那样,你正在排序RECORD结构而不是字符指针,所以比较函数和qsort调用都需要考虑到这一点。

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

答案 2 :(得分:1)

首先关闭(这就是为什么你的字符串不排序),double count = sizeof(r)/size;是错误的。 sizeof(r)没有做你期望的事情。您需要将此数组的大小传递给printRecords(),如此问题中所述:

How to get the length of array in C? is "sizeof" is one of the solution?

第二关, int compareByAge (const void * a, const void * b) //My other qsort that works backwards是向后的,因为你正在倒退。比较器功能总是返回A - B,而不是B - A.