c qsort似乎删除了数组中的最后一个值

时间:2010-10-31 09:27:33

标签: c sorting qsort

我使用内置的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>

1 个答案:

答案 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 );
}