------------------------------------------------------------------------------
MC logo
String Sort With Dynamic Allocation
[^] Code Examples
------------------------------------------------------------------------------
<<Simple String Sort simsortgrow.c List Command-Line Arguments.>>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/* 
 * Program to read a list of strings from standard input and print them in
 * sorted order.  This uses a simple selection sort.
 *
 * This version allows the storage arrays to grow as needed.
 */

/* Run malloc and die if it fails. */
void *msg_malloc(int size) 
{
        void *ret = malloc(size);
        if(ret == NULL) {
                fprintf(stderr, "Allocation failed.\n");
                exit(5);
        }

        return ret;
}

#define MAX_STRING_SIZE         50
int main(void)
{
        /* The start of each string. */
        int strings_size = 10;
        char **strings = msg_malloc(strings_size * sizeof(char *));

        /* Read the strings. */
        char buf[MAX_STRING_SIZE];
        int next_space = 0;
        int inloc = 0;
        while(scanf("%s", buf) == 1) {
                /* Make sure there's room in the index. */
                if(inloc >= strings_size) {
                        /* Double available space. */
                        strings_size *= 2;
                        strings = realloc(strings, 
                                          strings_size * sizeof(char *));
                        if(strings == NULL) {
                                fprintf(stderr, "Allocation failed.\n");
                                exit(4);
                        }
                }

                /* Add the string to the list. */
                int length = strlen(buf) + 1;
                char *str = msg_malloc(length);
                strcpy(str, buf);
                strings[inloc++] = str;
        }

        printf("--------------------------------------------------\n");

        /* Perform the sort.  Outer loop goes through destination of the
           minimum string. */
        int strloc;
        for(strloc = 0; strloc < inloc - 1; ++strloc) {
                /* Scan the remaining strings for ones smaller. */
                int scan;
                for(scan = strloc + 1; scan < inloc; ++scan) {
                        if(strcmp(strings[strloc], strings[scan]) > 0) {
                                /* Exchange the strings. */
                                char *tmp = strings[strloc];
                                strings[strloc] = strings[scan];
                                strings[scan] = tmp;
                        }
                }
        }

        /* Print 'em. */
        for(strloc = 0; strloc < inloc; ++strloc) {
                printf("%s\n", strings[strloc]);
        }
}
Reading: pp. 58-66
<<Simple String Sort List Command-Line Arguments.>>