fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. /*因為ansi標準不接受//註解形式*/
  6. /*先建Table好方便,規則二的先暫定給它-1*/
  7. char encodeTable[]={-1,'1','2','3',-1,'1','2',-1,-1,'2','2','4','5','5',
  8. -1,'1','2','6','2','3',-1,'1',-1,'2',-1,'2'};
  9.  
  10. /*編碼器*/
  11. char* encode(const char *n)
  12. {
  13. char mid[21]; /*中介*/
  14. char *re = malloc(5*sizeof(char)); /*最終結果*/
  15. re[0] = re[1] = re[2] = re[3] = '0';
  16. re[4] = '\0'; /*先預填'0'與'\0',完成規則5,6*/
  17. int i = 0, j = 1;
  18. /*第一個while完成規則2,4*/
  19. while(n[i] != '\0')
  20. {
  21. mid[i] = encodeTable[n[i]-'A'];
  22. i++;
  23. }
  24. mid[i] = '\0';
  25. i = 1;
  26. re[0] = n[0]; /*完成規則1*/
  27. /*第二個while完成規則3*/
  28. while(mid[i] != '\0')
  29. {
  30. /*
  31. 第一個先填入因為規則3的補充 including the first letter
  32. (規則1等等會完成)
  33. 之後有-1的都不填入
  34. 還要注意當前編碼是否與前一個相同
  35. 如果4個編碼已經填完後面就不處理了
  36. */
  37. if(mid[i] != -1 && mid[i-1] != mid[i])
  38. {
  39. re[j] = mid[i];
  40. j++;
  41. if(j == 4)
  42. break;
  43. }
  44. i++;
  45. }
  46. return re;
  47. }
  48.  
  49. int main()
  50. {
  51. char name[21];
  52. printf("%9s", "");
  53. printf("%-25s%s","NAME", "SOUNDEX CODE\n");
  54. while(scanf("%s", name) != EOF)
  55. {
  56. printf("%9s", "");
  57. printf("%-25s", name);
  58. char *tmp = encode(name);
  59. printf("%s\n", tmp);
  60. free(tmp);
  61. }
  62. printf("%19s", "");
  63. printf("%s\n","END OF OUTPUT");
  64.  
  65. return EXIT_SUCCESS;
  66. }
Success #stdin #stdout 0s 9424KB
stdin
LEE
KUHNE
EBELL
EBELSON
SCHAEFER
SCHAAK
stdout
         NAME                     SOUNDEX CODE
         LEE                      L000
         KUHNE                    K500
         EBELL                    E140
         EBELSON                  E142
         SCHAEFER                 S160
         SCHAAK                   S200
                   END OF OUTPUT