You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:24:05