455,906 Members | 1,416 Online
Need help? Post your question and get tips & solutions from a community of 455,906 IT Pros & Developers. It's quick & easy.

# Sorting a string aray in order of string length

 P: n/a 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! Nov 13 '05 #1
9 Replies

 P: n/a 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! Do your own homework? Tom Nov 13 '05 #2

 P: n/a 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" ????? news:_y********************@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! Do your own homework? Tom Nov 13 '05 #3

 P: n/a 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 #include 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); Nov 13 '05 #4

 P: n/a "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? -- Er*********@sun.com Nov 13 '05 #5

 P: n/a 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 Nov 13 '05 #6

 P: n/a "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 admire. Brian Rodenborn Nov 13 '05 #7

 P: n/a pete 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 #include 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. Nov 13 '05 #8

 P: n/a Kevin Easton wrote: pete 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 #include 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; -- pete Nov 13 '05 #9

 P: n/a pete 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. Nov 13 '05 #10

### This discussion thread is closed

Replies have been disabled for this discussion.