Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Feb 1996 22:31:20 -0700
From:      Tony Jones <tony@rtd.com>
To:        questions@freebsd.org
Subject:   Re: C question: what is wrong with this code
Message-ID:  <199603010531.WAA17108@seagull.rtd.com>

next in thread | raw e-mail | index | archive | help
In article <Pine.BSF.3.91.960229164732.5332A-100000@lisa.rur.com> you wrote:

: I am having a problem with elementary C. The following stub
: reproduces the problem exactly. What am I doing wrong?

I'm not even going to ask why you are using char arrays rather than ints :-)

1) comparing integers lexically won't work
	3468 is lexically < 400

	#include <string.h>

	main()
	{
        	printf("%d\n", strcmp("3468", "400"));
	}

	zebedee:12% ./a.out
	-1

2) From the man page:
     >The contents of the array base are sorted in ascending order according to
     >a comparison function pointed to by compar, which requires two arguments
     >pointing to the objects being compared.
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

	If your array was made of int's, the comparison function would receive
	int*. In your case, the arguments are char**, since your array contains
	elements of type char *.

tony

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

#define TABLESIZE       10
#define ITERATIONS      10

int f(const void *p1, const void *p2)
{
int     a1 = atoi(*(char **)p1),
        a2 = atoi(*(char **)p2);

        if (a1 == a2) 
                return 0;
	else return a1 < a2 ? -1 : 1;
}

main()
{

        int     i, j , n;
        char    *table[TABLESIZE], buff[1024];

        for (i = 0; i < ITERATIONS; i++)
                {
                /*
                 * populate the table with some random strings
                 */
                n = random() % TABLESIZE + 1;
                for (j = 0; j < n; j++)
                        {
                        sprintf(buff, "%d", random() % 10000);
                        table[j] = strdup(buff);
                        }
                for (j = 0; j < n; j++)
                        printf("%s\t", table[j]);
                printf("\n");

                /* so far, so good. Now sort the table */
                /* qsort(table, n, sizeof(char *), strcmp); */

                qsort((void *)table, n, sizeof(char *), f);

                for (j = 0; j < n; j++)
                        printf("%s\t", table[j]);
                printf("\n");
                /* huh!? Doesnt look sorted, does it? */

                for (j = 0; j < n; j++)
                        free(table[j]);
                }

        exit(0);
}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199603010531.WAA17108>