为什么带有以下代码的程序崩溃?如何解决?

时间:2014-01-15 14:45:16

标签: c

我设置了以下代码,它实际上编译没有错误,但它一直崩溃我开始它。该代码应该从.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");
        }

    }

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

首先:始终检查open()

的结果

然后:\ n可能是两个字符(CR / LF),因此与'\ n'比较不合适

答案 1 :(得分: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