Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   Sorting a string aray in order of string length (http://www.velocityreviews.com/forums/t314103-sorting-a-string-aray-in-order-of-string-length.html)

 Tom St Denis 07-09-2003 01:14 PM

Re: Sorting a string aray in order of string length

C.K. wrote:
> Given an array of strings (i.e char *strings[10]), write C code to sort the
> list in increasing order of string length. Run time efficiency is a primary
> concern.
>
> Thanks a lot!

Tom

 C.K. 07-09-2003 01:18 PM

Sorting a string aray in order of string length

Given an array of strings (i.e char *strings[10]), write C code to sort the
list in increasing order of string length. Run time efficiency is a primary
concern.

Thanks a lot!

 C.K. 07-09-2003 01:23 PM

Re: Sorting a string aray in order of string length

No, I am now enjoying my summer vacation.

This is a question that I find from 'C Challenge' of a website. I am just
curious on how to solve it in an elegant way.

"Tom St Denis" <tomstdenis@iahu.ca> ?????
news:_yUOa.103987\$2ay.98880@news01.bloor.is.net.ca ble.rogers.com...
> C.K. wrote:
> > Given an array of strings (i.e char *strings[10]), write C code to sort

the
> > list in increasing order of string length. Run time efficiency is a

primary
> > concern.
> >
> > Thanks a lot!

>
>
> Tom
>

 pete 07-09-2003 01:43 PM

Re: Sorting a string aray in order of string length

C.K. wrote:
>
> Given an array of strings (i.e char *strings[10]),
> write C code to sort the list in increasing order of string length.
> Run time efficiency is a primary concern.

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

int compare(const void *arg1, const void *arg2)
{
size_t L1, L2;

L1 = strlen(arg1);
L2 = strlen(arg2);
return L2 > L1 ? -1 : L1 > L2;
}

qsort
(strings, sizeof strings/sizeof *strings, sizeof *strings, compare);

 Eric Sosman 07-09-2003 01:50 PM

Re: Sorting a string aray in order of string length

"C.K." wrote:
>
> Given an array of strings (i.e char *strings[10]), write C code to sort the
> list in increasing order of string length. Run time efficiency is a primary
> concern.

Why is run time efficiency a primary concern when sorting
an array of just ten elements? With such a short array, how
do you even hope to measure the run time to find out what kind
of efficiency you've achieved?

--
Eric.Sosman@sun.com

 Chris Dollin 07-09-2003 02:52 PM

Re: Sorting a string aray in order of string length

C.K. wrote:

> No, I am now enjoying my summer vacation.
>
> This is a question that I find from 'C Challenge' of a website. I am just
> curious on how to solve it in an elegant way.

The best way is to *try it yourself*, *then* ask for suggestions.

--
Chris "electric hedgehog" Dollin
C FAQs at: http://www.faqs.org/faqs/by-newsgrou...mp.lang.c.html
C welcome: http://www.angelfire.com/ms3/bchambl...me_to_clc.html

 Default User 07-09-2003 04:24 PM

Re: Sorting a string aray in order of string length

"C.K." wrote:
>
> No, I am now enjoying my summer vacation.
>
> This is a question that I find from 'C Challenge' of a website. I am just
> curious on how to solve it in an elegant way.

Don't top-post. Your replies belong following properly trimmed quotes.

The point of a C challenge is for YOU to work on it. Do your best and
post it here for critique. We don't do programming for random people to

Brian Rodenborn

 Kevin Easton 07-10-2003 01:50 AM

Re: Sorting a string aray in order of string length

pete <pfiland@mindspring.com> wrote:
> C.K. wrote:
>>
>> Given an array of strings (i.e char *strings[10]),
>> write C code to sort the list in increasing order of string length.
>> Run time efficiency is a primary concern.

>
> #include <string.h>
> #include <stdlib.h>
>
> int compare(const void *arg1, const void *arg2)
> {
> size_t L1, L2;
>
> L1 = strlen(arg1);
> L2 = strlen(arg2);
> return L2 > L1 ? -1 : L1 > L2;
> }
>
> qsort
> (strings, sizeof strings/sizeof *strings, sizeof *strings, compare);

You obviously didn't test this, because that won't work at all. The
const void * arguments qsort passes to the compare function are pointers
to the array elements - not the array elements themselves. In this
case, they're pointer-to-pointer-to-char, converted to void *. In this
case, the correct comparison function would be:

int lencomp(const void *a, const void *b)
{
char * const *sa = a;
char * const *sb = b;
size_t alen = strlen(*sa);
size_t blen = strlen(*sb);

return (alen > blen) - (alen < blen);
}

- Kevin.

 pete 07-10-2003 04:14 AM

Re: Sorting a string aray in order of string length

Kevin Easton wrote:
>
> pete <pfiland@mindspring.com> wrote:
> > C.K. wrote:
> >>
> >> Given an array of strings (i.e char *strings[10]),
> >> write C code to sort the list in increasing order of string length.
> >> Run time efficiency is a primary concern.

> >
> > #include <string.h>
> > #include <stdlib.h>
> >
> > int compare(const void *arg1, const void *arg2)
> > {
> > size_t L1, L2;
> >
> > L1 = strlen(arg1);
> > L2 = strlen(arg2);
> > return L2 > L1 ? -1 : L1 > L2;
> > }
> >
> > qsort
> > (strings, sizeof strings/sizeof *strings, sizeof *strings, compare);

>
> You obviously didn't test this, because that won't work at all.
> The const void * arguments qsort passes to the compare function
> are pointers to the array elements
> - not the array elements themselves.
> In this case, they're pointer-to-pointer-to-char,
> converted to void *.
> In this case, the correct comparison function would be:
>
> int lencomp(const void *a, const void *b)
> {
> char * const *sa = a;
> char * const *sb = b;
> size_t alen = strlen(*sa);
> size_t blen = strlen(*sb);
>
> return (alen > blen) - (alen < blen);
> }

Thank you.
almost every single time that I post untested code.

My compiler likes it better this way:

char const **sa = a;
char const **sb = b;

--
pete

 Kevin Easton 07-10-2003 10:08 AM

Re: Sorting a string aray in order of string length

pete <pfiland@mindspring.com> wrote:
> Kevin Easton wrote:

[...]
>> int lencomp(const void *a, const void *b)
>> {
>> char * const *sa = a;
>> char * const *sb = b;

[...]
> My compiler likes it better this way:
>
> char const **sa = a;
> char const **sb = b;

Then your compiler is broken :). const void *a; and char * const *sa;
are equivalently-qualified pointers, but char const **sa; is not. The
first points to a const-qualified void, the second to a const-qualified
pointer to char, but the third points to a non-qualified pointer to a
pointer to const-qualified char.

- Kevin.

 All times are GMT. The time now is 10:37 AM.