title: C: dictionary implemented from a txt file with linked lists and a hash table can't find words that exist in the file
body: <p>Please excuse any mistakes made in this post, as this is my first post here, but do point them out.</p>
  
  <p>I'm still quite new to C, but I'm trying to implement a dictionary from a txt file that has one word in each line through a hash table but whenever I try to search for a word it's never found, though it exists in the file.</p>
  
  <p>Can you please help me figure out what I'm doing wrong?</p>
  
  <p>Both following files:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  #define tab_size 29                  /* table size */
  #define word_len 24                  /* max length of word */
  </code></pre>
  
  <p>.h file:</p>
  
  <pre><code>/* structure to be used for each word */
  
  typedef struct list {
        char *word;                  
        struct list *next;         
  } WORD;
  </code></pre>
  
  <p>.c file:</p>
  
  <pre><code>/* create table */ 
  
  WORD **create_tab(int size) {
         int i = 0;
         WORD **hash_tab;
         hash_tab = malloc(sizeof(*hash_tab) * size);    /*allocate memory */
         for (; i&lt;size; i++)              /* initialize elements */
                hash_tab[i]=NULL;
  return hash_tab;
  }
  
  
  /* search for word in table; returns 1 if found, 0 otherwise */
  
  int search(WORD **tb, char *w) {
        WORD *htmp/*, *hprv*/;
        unsigned long hash = (hash_f(w) % tab_size);     /* hash_f is Dan Bernstein's hash function; modulo by tab_size to make sure it fits */  
        for (htmp = tb[hash]; (htmp != NULL) &amp;&amp; (strcmp(htmp-&gt;word, w) != 0); / htmp = htmp-&gt;next)      /* follow chained array of respective cell until word is found or until the end */
        {
          ;
        }
        if (htmp == NULL) return 0;
  return 1;
  }
  
  
  /* insert new WORD with word w at the beginning of the chained array of the respective cell */
  
  void insert(WORD **ht, char *w) {
     WORD *htmp;
     unsigned long hash = (hash_f(w) % tab_size);     /* hash_f is Dan Bernstein's hash function; modulo by tab_size to make sure it fits */
     htmp = malloc( sizeof(*htmp) );      /* allocate memory for new WORD */
     htmp-&gt;word = calloc(word_len+1,sizeof(char));    /* allocate memory for new word with  max word length plus one character to make sure there's no buffer overflow in the next line*/
     strncpy(htmp-&gt;word, w, word_len);             /* copy w to word */  
     htmp-&gt;next = ht[hash];                   /* new WORD now points to content of the respective table cell */
     ht[hash] = htmp;                /* table cell now points to new WORD */
  }
  
  /* receive empty table and create the whole dictionary in memory word by word */
  
  WORD **make(WORD **dic;) {  
        char w[word_len];         
        FILE *dictionary;    
        dictionary = fopen("dictionary.txt","r");                   
        while ((fgets( w, word_len, dictionary )) != NULL)    
            insert(dic, w);                    
        fclose(dictionary);  
  return dic;
  }
  
  
  
  int main() {
       WORD **dic;
       char w[word_len];
       dic = create_tab(tab_size);     /* create the table */
       dic = make(dic);                   /* insert all entrys of dictionary in table */
       printf("Insert a word in lowercase: \n"); 
       if ((scanf("%s",w)) == 0) return 0;    /* if I didn't somehow verify the scanf it would return an error */
       else if (search(dic, w) == 1) printf("The word %s exists in the dictionary \n",w);
            else printf("The word %s does not exist in the dictionary",w);
  return 0;
  }
  </code></pre>
  
  <p>I've tried several aproaches, some based on the following links, but this always happens. This version is based on the last one.</p>
  
  <p><a href="https://stackoverflow.com/questions/4384359/quick-way-to-implement-dictionary-in-c">Quick Way to Implement Dictionary in C</a>
  <a href="http://www.sparknotes.com/cs/searching/hashtables/section3.rhtml" rel="nofollow noreferrer">http://www.sparknotes.com/cs/searching/hashtables/section3.rhtml</a>
  <a href="http://www.seg.rmit.edu.au/code/zwh-ipl/hashtable.c" rel="nofollow noreferrer">http://www.seg.rmit.edu.au/code/zwh-ipl/hashtable.c</a></p>