soundex.c

Denna kod är public domain. Om ni hittar fel eller vill ändra något i koden blir jag jätteglad om ni skickar dessa ändringar till jesper [at] fantasi [punkt] se.


/* Soundex-koder anv�nds n�r man vill hitta str�ngar (vanligtvis namn).
 * Koden som genereras blir den samma oavsett stavning av ordet, man kan d�rf�r
 * hitta r�tt ord trots att man inte stavar det exakt som det �r skrivet i
 * s�kk�llan. (Ja, det �r s� nummerupplysningen g�r.)
 */

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

#define ESC 27  /* Vi vill inte ha magiska konstanter i koden */

static void soundex(char *src, char *dst)
{
   int indx = 0, dindx = 1;

   *dst = '0';
   while(src[indx] != '\0')
   {
      /* F�r att g�ra om tecknet till stor bokstav sl�cker vi bit #5 nedan */
      switch(src[indx] & 0xdf)
      {
         case 'B' :
         case 'P' :
         case 'V' :
         case 'W' :
         case 'F' : if (dst[dindx - 1] != '1')
                       dst[dindx++] = '1';
                    break;
         case 'C' :
         case 'G' :
         case 'J' :
         case 'K' :
         case 'Q' :
         case 'S' :
         case 'X' :
         case 'Z' : if (dst[dindx - 1] != '2')
                       dst[dindx++] = '2';
                    break;
         case 'D' :
         case 'T' : if (dst[dindx - 1] != '3')
                       dst[dindx++] = '3';
                    break;
         case 'L' : if (dst[dindx - 1] != '4')
                       dst[dindx++] = '4';
                    break;
         case 'M' :
         case 'N' : if (dst[dindx - 1] != '5')
                       dst[dindx++] = '5';
                    break;
         case 'R' : if (dst[dindx - 1] != '6')
                       dst[dindx++] = '6';
                    break;
         default  : break;
      }
      indx++;
   }
   dst[dindx] = '\0';
   strcpy(dst, dst + 1);
}

/*
int main(void)
{
   char ord[100], kod[100];

   do
   {
      printf("Ange str�ng: ");
      (void)scanf("%s", ord);
      soundex(ord, kod);
      printf("Soundex kod: %s\n", kod);
   }
   while (strcmp(ord, "quit") != 0);
   return EXIT_SUCCESS;
}
*/

#define MAXLINE 9
#define MAXFORMAT sizeof("%9999s")

int main(void)
{
   char ord[MAXLINE + 1], kod[MAXLINE + 1];
   char format[MAXFORMAT];

   sprintf(format, "%%%ds", MAXLINE);
   if (EOF == scanf(format, ord))
      return EXIT_SUCCESS; 
   soundex(ord, kod);
   fputs(kod, stdout);
   return EXIT_SUCCESS;
}