2014-01-15 34 views
-3

我得到了下面的代碼設置,它實際上編譯沒有錯誤,但它始終崩潰,我開始它。該代碼應該讀取並保存.txt文件中的行,並查找它顯示的最長副本。由於.txt文件大約有127.000個字符,因此我在分配內存方面遇到了一些問題,但問題可能與此有關。爲什麼具有以下代碼的程序崩潰?如何解決這個問題?

# include <stdio.h> 
# include <stdlib.h> 
# include <string.h> 
# include <math.h> 
# include <stddef.h> 
# include <ctype.h> 

    main(){ 

    printf("test\n"); 

    FILE *Datei; 
    size_t i; 
    size_t j; 

    Datei = fopen("Eingabe.txt", "r"); 

    //Zeilen einlesen 

    size_t Zeilen_anzahl; 
    size_t Zeilen_groesse; 
    char **Zeile = NULL; 
    char puffer[512]; 

     while(fgets(puffer, sizeof(puffer), Datei) != NULL) { 
      if (Zeilen_anzahl >= Zeilen_groesse) { 
       Zeilen_groesse = Zeilen_groesse*2 + 1; 
       Zeile = realloc(Zeile, Zeilen_groesse * sizeof(*Zeile)); //Fehlerfall? 
      } 
     size_t laenge = strlen(puffer); 
      if (laenge > 0 && puffer[laenge - 1] == '\n') puffer[--laenge] = '\0'; 
       laenge++; 
       Zeile[Zeilen_anzahl] = malloc(laenge); 
       memcpy(Zeile[Zeilen_anzahl], puffer, laenge); 
       Zeilen_anzahl++; 
      } 

    fclose(Datei); 

    //Duplikat suchen 

    size_t laengste = 0; 
    size_t index = 0; 

     for(i = 0; i < Zeilen_anzahl; i++) { 

      size_t kleinste = strlen(Zeile[i]) + 1; 

       if (kleinste <= laengste) continue; //kleiner als längstes Duplikat 

        for(j = 0; j < i; j++) { 
         if (strcmp(Zeile[i], Zeile[j]) == 0) { //Duplikat gefunden 
          laengste = kleinste; 
          index = i; 

       break;  //überspringen 
         } 
        } 

     } 

     if (laengste > 0) { 
      printf("Längstes Duplikat ist: \"%s\".\n"); 
     } 

     else { 
      printf("Keine Duplikate gefunden.\n"); 
     } 

    } 

在此先感謝您的幫助!

+0

編輯:我很想保持這樣的代碼,因爲我基本上明白髮生了什麼,請不要提出任何其他功能使用有更好的表現。在我解決這個問題之前,我很想有一個工作計劃。 – user3195768

+2

崩潰時顯示什麼錯誤? –

+1

此外,您還沒有爲'printf(「LängstesDuplikat ist:\」%s \「。\ n」)提供額外的字符串參數;' –

回答

0

首先:經常檢查的開放()

結果然後:\ n可以是兩個字符(CR/LF),所以用 '\ n' 進行比較是不apropriate

0

另外一些缺少錯誤檢查,我發現了以下錯誤:

size_t Zeilen_anzahl = 0; // Forgot to initialize 
size_t Zeilen_groesse = 1; // Forgot to initialize 
char **Zeile = NULL; 
char puffer[512]; 
Zeile = malloc(Zeilen_groesse * sizeof(*Zeile)); // I had to add this, not sure why. realloc should work on NULL pointer 

    while(fgets(puffer, sizeof(puffer), datei) != NULL) { 
     if (Zeilen_anzahl >= Zeilen_groesse - 1) { // Off by one in size check 
+0

哦,我非常感謝!這解決了崩潰問題。儘管我似乎並不需要「Zeile = malloc(Zeilen_groesse * sizeof(* Zeile));」它不應該被要求,對吧? – user3195768

+0

我同意,但我運行它,'realloc'似乎與'char ** Zeile = NULL在我的機器上工作'' – Unheilig

+0

malloc不應該是必需的。 –