Listing 10 Extracts unique alphanumeric tokens from standard input

/* index3.c: Print unique tokens from standard input */

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

#define MAXWIDTH 32
#define MAXTOKENS 1024

static int comp(const void *, const void *);

static char tokens [MAXTOKENS] [MAXWIDTH];

main()
{
   size_t i, n;
   size_t idx[MAXTOKENS];
   char *last;
   char *format = "%*[^A-Za-z0-9]%[A-Za-z0-9]";

   /* Read tokens & initialize index array */
   for (n = 0; n <MAXTOKENS &&
             scanf(format,tokens[n]) != EOF; ++n)
      idx[n] = n;
   qsort(idx,n,sizeof idx[0],comp);

   /* Output only unique tokens */
   puts((last = tokens[idx[0]]));
   for (i = 1; i < n; ++i)
      if (strcmp(tokens[idx[i]],last) != 0)
         puts((last = tokens[idx[i]]));
      return 0;
}

static int comp(const void *p1, const void *p2)
{
   size_t i = * (size_t *) p1;
   size_t j = * (size_t *) p2;

   return strcmp(tokens[i],tokens[j]);
}

/* End of File */