soundex.cDenna 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;
}
|