arrays - 对 Char 类型的结构数组进行排序,qsort
问题描述
我遇到了 zsh: 分段错误(此错误与内存有关)我不知道它为什么会发生。我正在尝试为我的结构中的字符串创建一个比较函数。我需要程序能够按升序对字符串进行排序。
当前代码:
#include <stdio.h>
#include <string.h>
#include "stdlib.h"
# define MAX 7
typedef struct{
double price;
char title[60];
} game;
game gArr[MAX];
game buildGame(double num, const char *title);
void printGame(game);
int compGamesByTitle(const void * a,const void * b);
int main(){
gArr[0] = buildGame(0.01, "Minecraft");
gArr[1] = buildGame(22.79 , "Opus Magnum");
gArr[2] = buildGame(7.79 , "TIS-100");
gArr[3] = buildGame(14.99 , "Trainz");
gArr[4] = buildGame(0 , "Code Combat");
gArr[5] = buildGame(7.79, "Lemmings Revolution");
gArr[6] = buildGame(64.96 , "Warcraft");
qsort(gArr,sizeof(gArr)/sizeof(gArr[0]), sizeof(gArr[0]), compGamesByTitle);
printf("Sorted Games:\n");
for (int i = 0; i < MAX; i++){
printGame(gArr[i]);
}
return 0;
}
int compGamesByTitle(const void *a,const void *b){
char **aa = (char **)a;
char **bb = (char **)b;
return strcmp(*aa,*bb);
}
game buildGame(double num, const char *title){
game g;
g.price = num; strcpy(g.title, title);
return g;
}
void printGame(game g){
printf("Game g: %.2f, %s\n", g.price, g.title);
}
我认为问题与未分配的内存有关,但我不确定在哪里或为什么。
所需输出: 结构数组中的字符串应按字母顺序 (az) 升序排序。
解决方案
不,您的问题与未初始化的内存无关。作为第四个参数传递的比较函数qsort
接收指向正在比较的数组元素的指针。由于您gArr
是一个game
对象数组,但是您正在转换到char**
内部,因此compGamesByTitle
您最终会调用strcmp
不指向以空字符结尾的字节字符串的指针,从而调用未定义的行为。
您的比较函数应该看起来像这样
int compGamesByTitle(const void *a,const void *b){
const game *aa = a;
const game *bb = b;
return strcmp(aa->title, bb->title);
}
推荐阅读
- data-structures - 验证红黑树
- javascript - 在保存之前从 MongoDB 中删除一个字段
- multithreading - 从 Python 线程更新 PyQt GUI
- visual-studio-code - 如何为 eslint 安装 openlayers 配置?
- c# - passed strings from C# is different with C++ strings , both are const char
- c# - 如何在重定向到 asp.net core 2.0 中的另一个 Web 应用程序之前按摩数据
- java - 无法找到或加载主类 org.apache.maven.wrapper.MavenWrapperMain
- selenium-webdriver - 我可以通过自动化(即 Selenium 等)为移动设备启用仿真启动 Microsoft Edge 吗?
- laravel - 在laravel中同时循环遍历两列
- google-bigquery - Google Dataflow 模板 BigQuery 参数值异常