C语言实现电话本管理调用qsort函数编译报错问题咨询
电话本qsort排序问题修复
报错根因
你遇到的编译错误是qsort函数传参完全不符合标准要求导致的,标准库qsort的原型为:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
你代码中的错误点如下:
- 第三个参数为单个数组元素的大小,你错误传了
sizeof(int),实际应该是你自定义结构体的大小sizeof(telefonbucheintrag) - 第四个参数要求传入排序规则对应的比较函数指针,你错误传入了整型变量
telefonbucheintraege,直接触发语法报错 - 额外问题:代码使用
int32_t类型但未引入<stdint.h>头文件,部分编译器会报错 - 额外问题:
malloc申请的字符串内存未释放,存在内存泄漏
修复后完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> typedef struct { char* vorname; char* nachname; char* telefonnummer; } telefonbucheintrag; // 排序比较函数:先按姓氏字典序,姓氏相同按名字字典序 int compare_eintrag(const void* a, const void* b) { const telefonbucheintrag* eintrag_a = (const telefonbucheintrag*)a; const telefonbucheintrag* eintrag_b = (const telefonbucheintrag*)b; // 先比较姓氏 int nachname_cmp = strcmp(eintrag_a->nachname, eintrag_b->nachname); if (nachname_cmp != 0) { return nachname_cmp; } // 姓氏相同比较名字 return strcmp(eintrag_a->vorname, eintrag_b->vorname); } void schreibe_eintrag( telefonbucheintrag* eintrag_ptr, char* vorname, char* nachname, char* telefonnummer) { eintrag_ptr->vorname = malloc(strlen(vorname)+1); eintrag_ptr->nachname = malloc(strlen(nachname)+1); eintrag_ptr->telefonnummer = malloc(strlen(telefonnummer)+1); strcpy(eintrag_ptr->vorname, vorname); strcpy(eintrag_ptr->nachname, nachname); strcpy(eintrag_ptr->telefonnummer, telefonnummer); } int main() { telefonbucheintrag telefonbuch[100]; int32_t telefonbucheintraege = 0; schreibe_eintrag(telefonbuch+0, "Ada", "Lovelace", "004917155669988"); schreibe_eintrag(telefonbuch+1, "Alan", "Turing", "004917155669922"); schreibe_eintrag(telefonbuch+2, "Ingo", "Mueller", "004917155669911"); schreibe_eintrag(telefonbuch+3, "Ilse", "Mueller", "004917155669933"); schreibe_eintrag(telefonbuch+4, "Stefan", "Sadat", "004917155669988"); telefonbucheintraege = 5; // 正确调用qsort qsort(telefonbuch, telefonbucheintraege, sizeof(telefonbucheintrag), compare_eintrag); // 测试输出排序结果 for (int i = 0; i < telefonbucheintraege; i++) { printf("%s %s: %s\n", telefonbuch[i].nachname, telefonbuch[i].vorname, telefonbuch[i].telefonnummer); } // 释放申请的内存 for (int i = 0; i < telefonbucheintraege; i++) { free(telefonbuch[i].vorname); free(telefonbuch[i].nachname); free(telefonbuch[i].telefonnummer); } return 0; }
内容的提问来源于stack exchange,提问作者Oliver Brown
相关产品推荐
相关产品推荐

