排序结构数组
Sorting array of structs
我定义了一个结构数组
typedef struct sorting {
int number
} SRT;
SRT *mystr = NULL;
这是我后来动态分配的。
我想按 number
int;
排序
我必须编写什么样的函数才能让 qsort 执行此操作?我写了:
qsort(mystr,array_index,sizeof(mystr),magic);
int magic(const void *a, const void *b) {
int one=((const struct mystr*)a)->number;
int two(( const struct myst*)b)->number;
return ( one-two);
}
但是没用。我该怎么做?
它抛出关于未命名类型的错误。
两个问题:
qsort(mystr,array_index,sizeof(mystr),magic);
mystr
是指向 SRT
的指针,因此您传递的是指向结构的指针的大小,而不是结构的大小:
qsort(mystr,array_index,sizeof(STR),magic);
然后是这个:
int one=((const struct mystr*)a)->number;
int two(( const struct myst*)b)->number;
mystr
是变量名,不是类型,并且 myst
未在任何地方定义。您需要此处的类型名称:
int one=((const SRT *)a)->number;
int two=((const SRT *)b)->number;
您无法使用所写的函数可靠地对数组进行排序:
它有语法错误,其中一些是拼写错误,另一些则表明类型、结构标签和变量名称之间存在混淆。
return (one - two);
仅适用于 one
和 two
的相当小的值。如果存在整数算术溢出,它将调用未定义的行为。例如one == INT_MAX
和two == -1
,one - two
的值不是C语言指定的,在普通平台上很可能是returnINT_MIN
,负值,导致排序不正确。
一个简单的解决方案是:
int sort_function(const void *a, const void *b) {
int one = ((const SRT*)a)->number;
int two = ((const SRT*)b)->number;
return (one > two) - (one < two);
}
如果 one
小于 two
,则表达式 (one > two) - (one < two)
的计算结果为 -1
,如果它们相等,则为 0
,否则为 1
.在 C 语言中,如果为假,比较求值为 0
,如果为真,则求值为 1
。
排序功能应该这样使用:
qsort(mystr, array_count, sizeof(*mystr), sort_function);
- 第二个参数是
mystr
指向的数组中的结构体个数。
- 第三个参数是单个结构的大小:
sizeof(mystr)
是指针的大小,而不是指向的内容的大小。
- 避免像
magic
这样的神秘名称...对类型、函数和变量使用描述性名称。
我定义了一个结构数组
typedef struct sorting {
int number
} SRT;
SRT *mystr = NULL;
这是我后来动态分配的。
我想按 number
int;
我必须编写什么样的函数才能让 qsort 执行此操作?我写了:
qsort(mystr,array_index,sizeof(mystr),magic);
int magic(const void *a, const void *b) {
int one=((const struct mystr*)a)->number;
int two(( const struct myst*)b)->number;
return ( one-two);
}
但是没用。我该怎么做? 它抛出关于未命名类型的错误。
两个问题:
qsort(mystr,array_index,sizeof(mystr),magic);
mystr
是指向 SRT
的指针,因此您传递的是指向结构的指针的大小,而不是结构的大小:
qsort(mystr,array_index,sizeof(STR),magic);
然后是这个:
int one=((const struct mystr*)a)->number;
int two(( const struct myst*)b)->number;
mystr
是变量名,不是类型,并且 myst
未在任何地方定义。您需要此处的类型名称:
int one=((const SRT *)a)->number;
int two=((const SRT *)b)->number;
您无法使用所写的函数可靠地对数组进行排序:
它有语法错误,其中一些是拼写错误,另一些则表明类型、结构标签和变量名称之间存在混淆。
return (one - two);
仅适用于one
和two
的相当小的值。如果存在整数算术溢出,它将调用未定义的行为。例如one == INT_MAX
和two == -1
,one - two
的值不是C语言指定的,在普通平台上很可能是returnINT_MIN
,负值,导致排序不正确。
一个简单的解决方案是:
int sort_function(const void *a, const void *b) {
int one = ((const SRT*)a)->number;
int two = ((const SRT*)b)->number;
return (one > two) - (one < two);
}
如果 one
小于 two
,则表达式 (one > two) - (one < two)
的计算结果为 -1
,如果它们相等,则为 0
,否则为 1
.在 C 语言中,如果为假,比较求值为 0
,如果为真,则求值为 1
。
排序功能应该这样使用:
qsort(mystr, array_count, sizeof(*mystr), sort_function);
- 第二个参数是
mystr
指向的数组中的结构体个数。 - 第三个参数是单个结构的大小:
sizeof(mystr)
是指针的大小,而不是指向的内容的大小。 - 避免像
magic
这样的神秘名称...对类型、函数和变量使用描述性名称。