TOC | Prev | Next

Sorting

strcmp is the basis for sorting via qsort.

void qsort(void *base,
        size_t nmemb,
        size_t size,
        int (*compar)(const void *, const void *)
        );

qsort.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void dump_names( const char **names );
int reverse_nocase( const void *s1, const void *s2 );
int straight_order( const void *s1, const void *s2 );

int main( void ) {
    const char *names[] = {
        "Ricardo",
        "Damian",
        "chromatic",
        "Larry",
        "Allison",
        NULL,
    };
    const int names_count = (sizeof(names) / sizeof(names[0])) - 1;

    puts( "Initial order" );
    dump_names( names );

    puts( "Sorted with strcmp" );
    heapsort( names, names_count, sizeof(names[0]), straight_order );
    dump_names( names );

    puts( "Sorted with reverse_nocase" );
    heapsort( names, names_count, sizeof(names[0]), reverse_nocase );
    dump_names( names );

    return 0;
}

void dump_names( const char **names )
{
    const char *p;
    while ( (p = *names) != NULL ) {
        puts( p );
        names++;
    }
    puts( "" );
}

int straight_order( const void *s1, const void *s2 )
{
    const char * const * const a = s1;
    const char * const * const b = s2;

    return strcmp( *a, *b );
}

int reverse_nocase( const void *s1, const void *s2 )
{
    const char * const * const a = s1;
    const char * const * const b = s2;

    return -strcasecmp( *a, *b );
}

$ qsort

Initial order
Ricardo
Damian
chromatic
Larry
Allison

Sorted with strcmp
Allison
Damian
Larry
Ricardo
chromatic

Sorted with reverse_nocase
Ricardo
Larry
Damian
chromatic
Allison

TOC | Prev | Next