Sorting a string aray in order of string length

T

Tom St Denis

C.K. said:
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!

Do your own homework?

Tom
 
C

C.K.

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

C.K.

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.

Thanks in advance!


Tom St Denis said:
C.K. said:
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!

Do your own homework?

Tom
 
P

pete

C.K. said:
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);
 
E

Eric Sosman

C.K. said:
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?
 
C

Chris Dollin

C.K. said:
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.
 
D

Default User

C.K. said:
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
admire.




Brian Rodenborn
 
K

Kevin Easton

pete said:
C.K. said:
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.
 
P

pete

Kevin said:
pete said:
C.K. said:
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.
I make a mistake about that bad,
almost every single time that I post untested code.

My compiler likes it better this way:

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

Kevin Easton

pete said:
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top