user4744110
user4744110

Reputation:

Sorting strings with qsort does not work

I have a program, that asks several strings and should sort them. My code is:

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

#define MAX_STR_LEN 256

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

int main(void) 
{
    int strNum; // expected number of input strings
    int strCnt; // counter of strings
    char ** storage; // pointr to the memory when strings are stored
    char strBuf[ MAX_STR_LEN]; // buffer for strings
    char * strPtr; 
    // input of strings number
    do{
        printf("How many strings will be entered: ");
        while( scanf("%d", &strNum) != 1)
        {
            printf("ERROR: Not number was entered!\n");
            while( getchar() != '\n' );
            printf("Please enter a number: ");
        }
        if( strNum < 2 )
        {
            printf("ERROR: Number less than 2 was entered!\n");
        }
        while( getchar() != '\n' );
    }
    while(strNum < 2);
    // allocation of memory for pointers
    storage = (char **) calloc(strNum, sizeof(char*) );
    if( storage == NULL )
    {
        printf("ERROR: Unexpected problems with memory allocation!\n");
        return 1;
    }
    // input of strings
    for( strCnt = 0; strCnt < strNum; strCnt++)
    {
        printf("Enter string #%d:\n", strCnt + 1);
        fgets(strBuf,  MAX_STR_LEN, stdin);
        strPtr = strchr(strBuf, '\n');
        if( strPtr )
        {
            *strPtr = '\0';
        }
        else
        {
            strBuf[ MAX_STR_LEN - 1] = '\0';
        }
        // allocation memory for particular string
        storage[strCnt] = (char *) malloc(strlen(strBuf) + 1);
        if(storage[strCnt] == NULL)
        {
            printf("ERROR: Unexpected problems with memory allocation!\n");
            return 2;
        }
        // move string to dynamic memory 
        strcpy(storage[strCnt], strBuf);
    }
    // sort the strings
    qsort(storage, strNum, sizeof(char**), myStrCmp);
    // output the result
    printf("\nSorted strings:\n");
    for( strCnt = 0; strCnt < strNum; strCnt++)
    {
        printf("%s\n", storage[strCnt]);
    }
    return 0;
}

The simplest test shows the trouble:

How many strings will be entered: 3
Enter string #1:
ddd
Enter string #2:
aaa
Enter string #3:
ccc

Sorted strings:
ddd
aaa
ccc

I have tryed Visual C++ and gcc, but the result is the same. Please, say me what is wrong in the code?

Upvotes: 2

Views: 1041

Answers (1)

VolAnd
VolAnd

Reputation: 6407

The problem is in myStrCmp function.

Because a and b are elements in not a simple array, but in array of pointers, their type must be char ** and function that compares two elements have to be as follows:

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

Upvotes: 4

Related Questions