2016-08-08 7 views
0

Dies ist mein Code:Segment Fehler, wenn ich versuche, Wörterbuch zu schreiben, in C-Code

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

struct node { 
    char data [ 20 ]; 
    char m [ 20 ]; 
    int mcount; 
    struct node * next; 
}; 

struct node * dic [26]; 

void add(char *); 
int search(char *); 
void show(); 
void deldic(); 

void main() { 
    char word [ 20 ], ch; 
    int i; 



    while (1) { 

     printf("\n\t\tDictionary\n"); 
     printf("\n\t\t1.Add Word.\n"); 
     printf("\t\t2.Search Word.\n"); 
     printf("\t\t3.Show Dictionary.\n"); 
     printf("\t\t4.Update.\n"); 
     printf("\t\t0.Exit."); 
     printf("\n\n\t\tYour Choice "); 
     scanf("%d", &ch); 

     switch (ch) { 
      case 1: 

       printf("\nEnter any word : "); 
       fpurge(stdin); 
       gets(word); 
       add(word); 

       break; 

      case 2: 

       printf("\nEnter the word to search : "); 
       fpurge(stdin); 
       gets(word); 
       i = search(word); 
       if (!i) 
        printf("Word does not exists."); 


       break; 

      case 3: 

       show(); 


       break; 

      case 4: 
       printf("\nEnter any word to update: "); 
       fpurge(stdin); 
       gets(word); 
       update(word); 
       break; 

      default: 

       printf("\nWrong Choice"); 
     } 
    } 
} 

void add(char * str) { 
    int i, j = toupper(str [ 0 ]) - 65; 
    // 
    struct node * r, * temp = dic [ j ], * crawler; 
    char mean [ 20 ]; 

    i = search(str); 
    if (i) { 
     printf("\nWord already exists."); 

     return; 
    } 
    crawler = (struct node *) malloc(sizeof (struct node)); 
    strcpy(crawler -> data, str); 
    crawler -> next = NULL; 
    printf("\n\nEnter the meaning(s) : "); 
    gets(mean); 
    strcpy(crawler -> m, mean); 
    crawler -> mcount = i; 
    if (dic [ j ] == NULL || strcmp(dic [ j ] -> data, str) > 0) { 
     r = dic [ j ]; 
     dic [ j ] = crawler; 
     crawler -> next = r; 
     return; 
    } else { 
     while (temp != NULL) { 
      if ((strcmp(temp -> data, str) < 0) && ((strcmp(temp -> next -> data, str) > 0) || temp -> next == NULL)) { 
       crawler -> next = temp -> next; 
       temp -> next = crawler; 
       return; 
      } 
      temp = temp -> next; 
     } 
    } 
} 

int search(char *str) { 
    struct node *n; 
    char temp1 [ 20 ]; 
    char temp2 [ 20 ]; 
    int i; 

    n = dic [ toupper(str [ 0 ]) - 65 ]; 
    strcpy(temp2, str); 
    strupr(temp2); 

    while (n != NULL) { 
     strcpy(temp1, n -> data); 

     if (strcmp(strupr(temp1), temp2) == 0) { 
      printf("\n%s\t\t%s", n -> data, n -> m); 
      for (i = 1; i < n -> mcount; i++) 
       printf("\n\t\t%s", n -> m); 
      return 1; 
     } 
     n = n -> next; 
    } 
    return 0; 
} 

int update(char* str) { 
    struct node *n; 
    char temp1 [ 20 ]; 
    char temp2 [ 20 ]; 
    char mean [ 20]; 

    n = dic [ toupper(str [ 0 ]) - 65 ]; 
    strcpy(temp2, str); 
    strupr(temp2); 

    while (n != NULL) { 
     strcpy(temp1, n -> data); 

     if (strcmp(strupr(temp1), temp2) == 0) { 
      printf("\n\nEnter the meaning(s) : "); 
      gets(mean); 
      strcpy(n -> m, mean); 
      return 1; 
     } 
     n = n -> next; 
    } 
    return 0; 
} 
// print the dictionary 
void show() { 
    struct node *n; 
    int i, j; 

    printf("Word\t\tMeaning\n"); 
    for (i = 0; i <= 30; i++) 
     printf("-"); 


    for (i = 0; i <= 25; i++) { 
     n = dic [ i ]; 
     while (n != NULL) { 
      printf("\n%s\t\t%s", n -> data, n -> m); 
      for (j = 1; j < n -> mcount; j++) 
       printf("\n\t\t%s", n -> m); 
      n = n -> next; 
     } 
    } 
} 
//function to free pointer. 
void deldic() { 
    struct node *n, *t; 
    int i; 

    for (i = 0; i <= 25; i++) { 
     n = dic [ i ]; 
     while (n != NULL) { 
      t = n -> next; 
      free(n); 
      n = t; 
     } 
    } 
} 

Ich verknüpfte Liste mit diesem program.But zu schreiben, wenn ich zwei Wort lief und gibt ein: „go“ und "geht" mit ihrer Bedeutung. Der Fehler Segmentierungsfehler wird angezeigt. Ich hatte 1 Stunden damit verbracht. Schwierig, diesen Fehler zu beheben. Ich brauche einen Ratschlag. Danke fürs Lesen.

+0

haben Sie Zugriff auf gdb auf Ihrer Maschine? Es kann Ihnen sagen, dass genau die Linie segfault passiert dann von dort gehen – brad

+0

Es würde helfen, wenn Sie es auf die Funktion eingrenzen, wo es vorgekommen ist, Zusätzlich, wenn Sie auf Linux sind, möchten Sie möglicherweise Valgrind verwenden. – Elazar

+0

@brad Es passiert bei bekommt (bedeutet), wenn ich "goes" und seine Bedeutung eingeben. – JamesCornel

Antwort

0

Die Bedingung

(strcmp(temp->next->data, str) > 0) || temp->next == NULL 

entweder Buggy oder überflüssig. Wenn temp->next Null sein kann, ist temp->next->data ein Fehler. Wenn dies nicht möglich ist, wird der Test nicht benötigt. Vielleicht wollten Sie:

temp->next == NULL || (strcmp(temp->next->data, str) > 0) 
Verwandte Themen