2017-02-25 3 views
2

Hallo Leute Ich versuche eine Rechtschreibprüfung für einige Kursarbeit zu implementieren, aber ich bin neu in C und nur das Laden der Wörterbuchdatei ruiniert meinen Kopf. Der folgende Code wird zwar kompiliert, stürzt jedoch ab, wenn er ausgeführt wird. Manchmal nach dem Drucken von 500 Zeilen manchmal 1500, aber ich habe keine Ahnung, was könnte es verursachen!Wörterbuchdatei stürzt ab, aber kompiliert

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

int main(int argc, char *argv[]) 

{ 
FILE *words_ptr; //pointer for words.txt 

char new_word[100]; 
char temp_word[100]; 
char *dict[45440]; 
words_ptr = fopen("dictionary.txt", "r"); 
if(words_ptr != NULL) 
{ 
    printf("File dictionary.txt opened\n"); 
    int i = 0; 
    while (fgets(temp_word, 45440, words_ptr)) 
    { 
     new_word[i] = (char)calloc(strlen(temp_word), sizeof(char)); //ensuring new_word will be the right size 
     strcpy(new_word, temp_word);  //copy contents of temp_word to new_word 
     dict[i] = new_word;    //copy contents of new_word to i'th element of dict array 
     printf("printing out dict[%d]: %s\n", i, dict[i]); 
     i++; 
    } 
    printf("printing out dictionary1: %s\n", dict[1]); 

    fclose(words_ptr); 
    return 0; 
} 
else {printf("Unable to open file words.txt\n"); return 1;} 

} 
+1

* neues_wort [i] = (char) calloc (strlen (temp_wort), sizeof (char)); // sicherstellen, dass new_word die richtige Größe hat * Nicht korrekt zitiert. 'new_word' ist ein Byte zu klein - Sie haben den Platz für das abschließende' \ 0''-Zeichen vergessen. –

+1

Hinweis: Wirf das Ergebnis von 'calloc' & friends oder' void * 'nicht generell in C. – Olaf

+0

' fgets (temp_word, 45440, words_ptr) '' 'fgets (temp_word, 100, words_ptr)' –

Antwort

2

dieser Zeile:

new_word[i] = (char)calloc(strlen(temp_word), sizeof(char)); //ensuring new_word will be the right size 

nicht ausreichenden Speicherplatz bieten die Zeichenfolge zu kopieren. Es ist ein Byte zu kurz, da strlen() das abschließende Zeichen '\0' nicht enthält.

Auch new_word hat nur Platz für 100 char Einträge - es ist nicht einmal ein char *. Es ist völlig überflüssig. Speichern Sie einfach das Ergebnis von calloc() direkt an dict[i]:

dict[i] = strdup(temp_word); 

Und ja, es gibt eine Funktion strdup() die Duplikate ein String genannt. It's been part of the POSIX standard for about 16 years.

+0

Vielleicht möchten Sie den Code erneut lesen. – Jarvis

+0

Sie sind Meister, danke. Ich setzte dict [i] = strdup (temp_word); gerade drin und es funktioniert gut! –

3

Nach der Handbuchseite, Die calloc() Funktion weist Speicher für eine Anordnung von nmemb (erstes Argument) Elemente size (zweites Argument) Bytes und jeder gibt einen Zeiger auf den zugewiesenen Speicher. Der Speicher ist auf Null gesetzt.

Sie werfen im Grunde einen Zeiger auf Char und weiter zu einem Char zuordnen, was keinen Sinn macht. Statt new_word als char-Array deklarieren, machen es char * und tun calloc wie folgt aus:

char *new_word; 
... 
new_word = calloc(strlen(temp_word) + 1, sizeof(char)); 
+0

Netter Haken . Das ist schwer zu erkennen. –