gpt4 book ai didi

c - 如何使用 qsort 对结构进行排序?

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:13 25 4
gpt4 key购买 nike

我有一个这样声明的结构

struct data
{
char * Date;
char * String;
};
struct data **RegArray = NULL;

int ArrayCount = 0;

我以这种方式向数组添加新项:

struct data **tmp = ( struct data ** )realloc( RegArray, ( ArrayCount + 1 ) * sizeof( struct data * ) );
if ( tmp == NULL )
{
printf( "\nRealloc failed!" );
return;
}
RegArray = tmp;

RegArray[ ArrayCount ] = ( struct data * )malloc( sizeof **RegArray );
if ( RegArray[ ArrayCount ] == NULL )
{
printf( "\nMalloc failed!" );
return;
}

RegArray[ ArrayCount ]->Date = _strdup( cDate );
RegArray[ ArrayCount ]->String = _strdup( cString );

ArrayCount++;

比较值的函数:

int CompareByDate( const void *elem1, const void *elem2 )
{
//return ( ( data* )elem1 )->Date > ( ( data* )elem2 )->Date ? 1 : -1;
return strcmp( ( ( data* )elem1 )->Date, ( ( data* )elem2 )->Date );

}//CompareByDate

最后我这样调用 qsort:

qsort( RegArray, ArrayCount-1, sizeof( data ), CompareByDate );

问题是,数据不会被排序。那我做错了什么?

谢谢!

最佳答案

在您的qsort 调用和比较函数中,您忘记了您正在处理一个指针“数组”。最简单的更改是使用指针数组:

struct data *RegArray = NULL;

/* ... */

struct data *tmp = realloc( RegArray, ( ArrayCount + 1 ) * sizeof( struct data ) );
if ( tmp == NULL )
{
printf( "\nRealloc failed!" );
return;
}
RegArray = tmp;

RegArray[ ArrayCount ].Date = _strdup( cDate );
RegArray[ ArrayCount ].String = _strdup( cString );

ArrayCount++;

这将使您的 qsort 调用(和比较函数)按照问题中所示的方式工作。


如果您不想更改上述代码,则必须更改qsort 调用和比较函数:

qsort( RegArray, ArrayCount-1, sizeof( data * ), CompareByDate );

/* ... */

int CompareByDate( const void *elem1, const void *elem2 )
{
struct data **d1 = (struct data **) elem1;
struct data **d2 = (struct data **) elem2;

return strcmp((*d1)->Date, (*d2)->Date);
}

关于c - 如何使用 qsort 对结构进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20378135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com