我使用内置的qsort对结构数组进行排序。但是在调用qsort之后,数组中的最后一个元素似乎已经具有了我的值,我将其设置为空。
这是我的代码......
int numEntries = 5;
TvEntry* entries[numEntries]; //create array
//Entries get added to the array here...
qsort( *entries, numEntries, sizeof(TvEntry*), &compareByName ); //sort
displayAll( entries, numEntries ); //display
//here is my sort method
int compareByName( const void* val1, const void* val2 )
{
const TvEntry* entry1 = (TvEntry*)val1;
const TvEntry* entry2 = (TvEntry*)val2;
return strcasecmp( entry1->title, entry2->title );
}
//here is my display method
void displayAll( TvEntry* entries[], int length )
{
if( entries == NULL )
{
printf( "List is empty\n" );
}
else
{
int i = 0;
for( i = 0; i < length; i++ )
{
printf( "ENTRY: %s\n", entries[i]->title );
}
}
}
我应该提一下,如果我注释掉调用qsort的行,那么所有条目都会正确显示,但是当调用qsort时,这些条目都会显示(Not Sorted)并为最后一个条目打印一个空白值。< / p>
答案 0 :(得分:10)
qsort( *entries, numEntries, sizeof(TvEntry*), &compareByName);
错误,您不想取消引用数组的第一个元素。做到这一点
qsort(entries, numEntries, sizeof(TvEntry*), &compareByName);
此外,您的比较函数将接收指向元素的指针,元素是指针,因此它应该是例如。
int compareByName( const void* val1, const void* val2 )
{
const TvEntry** entry1 = (TvEntry**)val1;
const TvEntry** entry2 = (TvEntry**)val2;
return strcasecmp( (*entry1)->title, (*entry2)->title );
}