Viktor Apoyan
Viktor Apoyan

Reputation: 10755

Sort char pointer array in C

I am trying to sort array of char pointers, for that purpose I use qsort function, but I can't understand what I am doing wrong and how I can sort that array.

int StringCompare( const void* a, const void* b)
{
    char const *char_a = (char const *)a;
    char const *char_b = (char const *)b;

    return strcmp(char_a, char_b);
}

int main() {
    char *a[] = { "Garima",
          "Amit",
          "Gaurav",
          "Vaibhav"
        };

    int n;

    qsort( a, 4, sizeof(char*), StringCompare);
    for (n=0; n<4; n++)
        printf ("%c ",*a[n]);
}

The Output is: G A G V

Upvotes: 0

Views: 5008

Answers (4)

Jeff Loughlin
Jeff Loughlin

Reputation: 4174

Define your StringCompare function this way:

int StringCompare(const char **a, const char **b)
{
    return strcmp(*a, *b);
}

No need to clutter the code with explicit casting because you can implicitly cast a void pointer to any other pointer type.

Upvotes: 0

evilruff
evilruff

Reputation: 4085

proper comparator:

int StringCompare( const void* a, const void* b)
{ 
char const *char_a = *(char const **)a;
char const *char_b = *(char const **)b;

return strcmp(char_a, char_b);
}

NOTE:

according to sort description comparator function is:

compar
Pointer to a function that compares two elements.
This function is called repeatedly by qsort to compare two elements. 
It shall follow the       following prototype:

int compar (const void* p1, const void* p2);

so, it receives not a char*, but char**

proper output cycle:

for (n=0; n<4; n++)
    printf ("%s ", a[n]);

Upvotes: 1

mjhalwa
mjhalwa

Reputation: 533

If you want to sort char-arrays for the first letters, you could implement a function, that looks at the (unsigned) values of the first char in the array. As they are all equal to the numbers in the ASCII-standards. But you have to be careful if you mix upper case chars with lower case chars.

I know... its not a some special implemented function, but I once programmed it that way and it worked.

Upvotes: -1

Drew McGowen
Drew McGowen

Reputation: 11706

The issue is that the values passed to the sort function (a.k.a StringCompare) are pointers into the a array. In other words, they are of type const char **.

You need to instead declare char_a and char_b as const char **, and dereference them in the call to strcmp:

int StringCompare( const void* a, const void* b)
{
    char const **char_a = a;
    char const **char_b = b;

    return strcmp(*char_a, *char_b);
}

Also note the casts are unnecessary.

Upvotes: 3

Related Questions