home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #26 / NN_1992_26.iso / spool / comp / lang / c / 16277 < prev    next >
Encoding:
Text File  |  1992-11-10  |  3.2 KB  |  113 lines

  1. Path: sparky!uunet!caen!zaphod.mps.ohio-state.edu!not-for-mail
  2. From: ren@function.mps.ohio-state.edu (Liming Ren)
  3. Newsgroups: comp.lang.c
  4. Subject: Question about sample program in the man page of hsearch (hash functions)!
  5. Date: 10 Nov 1992 12:25:26 -0500
  6. Organization: Department of Mathematics, The Ohio State University
  7. Lines: 101
  8. Distribution: world
  9. Message-ID: <1dora6INNdgv@function.mps.ohio-state.edu>
  10. NNTP-Posting-Host: function.mps.ohio-state.edu
  11.  
  12. I want to learn how to use hsearch functions. I got a sample program from the man page of hsearch on UNIX.
  13. saddly, the program did not work . What's weired was  after I made an insignifficant change, it worked.
  14. I can see there are some diffenence. But I don't see what caused the problem in the old one (ss.c).
  15. It is also hard to believe the program in the man page has problems. Before this is clear to me, I don't feel 
  16. safe to use it.  PLEASE HELP!
  17.  
  18. The difference is shown as follows: (where ss.c is the original program, ttt.c is the modified one)
  19.  
  20.  
  21. [11:56am][/n/function/1/ren][29] diff ss.c ttt.c
  22. 18,19c18,19
  23. <   while ((scanf("%s%d%d", str_ptr, &info_ptr->age,                <-------In ss.c
  24. <              &info_ptr->room) !=EOF)&& (i++ <NUM_EMPL)) {
  25. ---
  26. >   while ((i++ <NUM_EMPL) &&scanf("%s%d%d", str_ptr, &info_ptr->age,           <-------In ttt.c
  27. >              &info_ptr->room) !=EOF){
  28.  
  29.  
  30. The following is a test run of this two programs. I used cc -g to compile them.
  31. [11:53am][/n/function/1/ren][31] ss
  32. qqq 1 2
  33. www 4 5
  34. 555 6 7
  35. 123 5 6
  36. enter done!
  37. qqq
  38. no such employee qqq                     <------------------------------not right!!!
  39. www
  40. no such employee www
  41. 555
  42. found 555, age = 6, room = 7
  43. 123
  44. no such employee 123
  45. ^D[11:54am][/n/function/1/ren][32] ttt    <---------all right.
  46. qqq 1 2
  47. www 4 5
  48. 555 6 7
  49. enter done!
  50. qqq
  51. found qqq, age = 1, room = 2
  52. www
  53. found www, age = 4, room = 5
  54. 555
  55. found 555, age = 6, room = 7
  56.  
  57.  
  58. End of session!!!!
  59.  
  60.  
  61. Here is the program ss.c obtained  by   "man hsearch"
  62.  
  63.  
  64. #include <stdio.h>
  65. #include <search.h>
  66. struct info {       /* this is the info stored in the table */
  67.   int age, room; /* other than the key. */
  68. };
  69. #define  NUM_EMPL    3    /* # of elements in search table */
  70. main( )
  71. {
  72.   char string_space[NUM_EMPL*20];
  73.   struct info info_space[NUM_EMPL];
  74.   char *str_ptr = string_space;
  75.   struct info *info_ptr = info_space;
  76.   ENTRY item, *found_item, *hsearch( );
  77.   char name_to_find[30];
  78.   int i = 0;
  79.   /* create table */
  80.   (void) hcreate(NUM_EMPL);
  81.   while ((scanf("%s%d%d", str_ptr, &info_ptr->age,
  82.            &info_ptr->room) !=EOF)&& (i++ <NUM_EMPL)) {
  83.     /* put info in structure, and structure in item */
  84.     item.key = str_ptr;
  85.     item.data = (char *)info_ptr;
  86.     str_ptr += strlen(str_ptr) + 1;
  87.     info_ptr++;
  88.     /* put item into table */
  89.     (void) hsearch(item,ENTER);
  90.   }
  91.   /* access table */
  92.   printf("enter done!\n");
  93.   item.key = name_to_find;
  94.   while (scanf("%s", item.key) != EOF) {
  95.     if ((found_item = hsearch(item,FIND)) != NULL) {
  96.       /* if item is in the table */
  97.       (void)printf("found %s, age = %d, room = %d\n",
  98.            found_item->key,
  99.            ((struct info *)found_item->data)->age,
  100.            ((struct info *)found_item->data)->room);
  101.     } else {
  102.       (void)printf("no such employee %s\n", name_to_find);
  103.     }
  104.   }
  105. }
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.