如何按字母顺序对多个“人员”字符串进行排序,而不让他们移动到不同的“座位”?

问题描述 投票:0回答:1

我正在用 C 编写一个座位预订程序,其中涉及一个选项,其中分配到座位的乘客可以按字母顺序排序。当我选择对它们进行排序的选项时,该函数确实按字母顺序对姓氏和名字进行排序,但是,在此过程中,会采用姓氏和名字参数并将它们移动到不同的座位。

我目前正在使用 qsort 函数对存储在名为“SEAT”的结构中的名称进行排序,该结构包含名字和姓氏字符以及座位 ID 和分配的整数。

SEAT结构:

typedef struct seat { // struct used to hold all SEAT variables

    int seatID;

    int occupied;

    char lastname[MAXNAME];

    char firstname[MAXNAME];

} SEAT;

qsort 函数位于一个名为“alphasortSeat”的较大函数内部,并使用另外两个名为“lastnameCompare”和“firstnameCompare”的函数作为其 CompareFuncion 参数。

我希望这个函数在调用时能够按名字或姓氏的字母顺序对姓名进行排序而不需要将数据移动到看似随机的座位分配。

例如: 座位 1 分配给:鲍勃·詹金斯,座位 2 分配给:习近平。

调用并执行该函数后,名称按字母顺序排序,但现在打印:

座位 1 分配给鲍勃·詹金斯

7号座位是习近平的

(实际上,名字现在已经分别移至11号和12号座位了。)

这是我当前使用的代码:

main.c:

scanf_s(" %c", &choice[0], MAXCHOICELEN); switch (choice[0]) { //..... case 'c': alphasortSeat(seats, MAXSEAT); // sorting the occupants by alphabetical order break; //.....

图书馆.c:

//.....

比较功能:

int lastnameCompare(const void* a, const void* b) { // function that compares lastname(s) in order to properly sort them later on alphabetically const SEAT* seatA = (const SEAT*)a; const SEAT* seatB = (const SEAT*)b; return strcmp(seatA->lastname, seatB->lastname); } int firstnameCompare(const void* a, const void* b) { // function that compares firstname(s) in order to properly sort them later on alphabetically const SEAT* seatA = (const SEAT*)a; const SEAT* seatB = (const SEAT*)b; return strcmp(seatA->firstname, seatB->firstname); }

字母排序功能:

void alphasortSeat(SEAT seats[], int seatNum) { // alphabetically sort names function char alphaChoice; printf("Sort by first or last name (f or l): "); scanf_s(" %c", &alphaChoice, MAXCHOICELEN); if (alphaChoice == 'f') { qsort(seats, seatNum, sizeof(SEAT), firstnameCompare); // qsort functions used to order the letters // qsort_s not used, "context" parameter (MAXSEAT) caused warnings (not needed). for(int i = 0; i < seatNum; i++){ if (seats[i].occupied) { printf("\n %s %s is assigned to seat %d.", seats[i].firstname, seats[i].lastname, seats[i].seatID); } } } else if (alphaChoice == 'l') { qsort(seats, seatNum, sizeof(SEAT), lastnameCompare); for (int i = 0; i < seatNum; i++) { if (seats[i].occupied) { printf("\n %s %s is assigned to seat %d.", seats[i].lastname, seats[i].firstname, seats[i].seatID); } } } else { fprintf(stderr, "\n\nERROR: Invalid character entered.\n\n"); // error statement for invalid character return; } } //.....

库.h:

int lastnameCompare(const void* a, const void* b); int firstnameCompare(const void* a, const void* b); void alphasortSeat(SEAT seats[], int seatNum);
我觉得主要问题是我没有正确使用 qsort,或者我的比较函数没有发挥应有的作用。我只是 C 的初学者,我很好奇为什么我的代码会产生如此奇怪的错误。

c sorting struct strcmp qsort
1个回答
0
投票
我无法重现您的问题。由于您是新来的,我们希望看到一个最小的非交互式代码示例,以便很容易为您提供帮助:

#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXNAME 42 typedef struct seat { int seatID; int occupied; char lastname[MAXNAME]; char firstname[MAXNAME]; } SEAT; #define genFieldCompare(field) \ int field ## Compare(const void *a, const void *b) {\ const SEAT *seatA = a;\ const SEAT *seatB = b;\ return strcmp(seatA->field, seatB->field);\ } genFieldCompare(firstname); genFieldCompare(lastname); void printSeat(const SEAT seats[], int seatNum) { for(int i = 0; i < seatNum; i++) if (seats[i].occupied) printf("%s %s is assigned to seat %d.\n", seats[i].firstname, seats[i].lastname, seats[i].seatID); printf("\n"); } int main(void) { SEAT seats[] = { {2, 1, "AXi", "Jinping"}, {1, 1, "Jenkins", "Bob"} }; size_t seatNum = sizeof seats / sizeof *seats; qsort(seats, seatNum, sizeof *seats, firstnameCompare); printSeat(seats, seatNum); qsort(seats, seatNum, sizeof *seats, lastnameCompare); printSeat(seats, seatNum); }
和示例输出:

Bob Jenkins is assigned to seat 1. Jinping AXi is assigned to seat 2. Jinping AXi is assigned to seat 2. Bob Jenkins is assigned to seat 1.
    
© www.soinside.com 2019 - 2024. All rights reserved.