Brute-Force-Algorithmus

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Xeon
Beiträge: 169
Registriert: So Dez 17, 2017 4:10 pm

Brute-Force-Algorithmus

Beitrag von Xeon » Mi Jun 19, 2019 1:38 pm

Hallo zusammen,

Lerne C in diesem Buch: C von A bis Z von Jürgen Wolf. Bin bei Kapitel 22 angekommen beim Brute-Force-Algorithmus.

Hier ist der link: http://openbook.rheinwerk-verlag.de/c_v ... 66326bcc13

Ich glaube der Code ist fehlerhaft:

Code: Alles auswählen

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

#define LEN 255
#define MAX_DAT 10
#define MAX_LINE 4096
#define LINE "---------------------------------------\n"


struct datei
{
    char name[LEN];
    int gefunden;
};

typedef struct datei DATEI;

int BruteForce(char *muster, char *text)
{
    int i = 0, j, cnt = 0;
    int m = strlen(muster);
    int n = strlen(text);

    while(i <= n - m)
    {
        for(j = 0; j < m && muster[j] == text[i+j]; j++);
        if(j == m)
        {
            printf("Pos. %3d, ", i);
            cnt++;
        }
        i++;
    }
    return cnt;
}


int main(int argc, char *argv[])
{
    DATEI suche[MAX_DAT];
    char suchstring[LEN];
    char read_line[MAX_LINE];
    FILE *f;
    int i, j, ret, zeile;

    if(argc < 3)
    {
        fprintf(stderr, "Verwendung: %s suchstring datei1 <datei2> - <datei%d>\n", argv[0], MAX_DAT);
        return EXIT_FAILURE;
    }
    strncpy(suchstring, argv[1], LEN);

    for(i = 2, j = 0; j < MAX_DAT && i < argc; i++, j++)
    {
        strncpy(suche[j].name, argv[i], LEN);
        suche[j].gefunden = 0;
    }
    for(i = 0; i < argc-2; i++)
    {
        f = fopen(suche[i].name, "r");
        if(f == NULL)
        {
            perror(NULL);
            continue;
        }
        zeile = 0;
        printf("\nDatei \"%s\": \n", suche[i].name);
        while(fgets(read_line, MAX_LINE, f) != NULL)
        {
            zeile++;
            ret = BruteForce(suchstring, read_line);
            if(ret != 0)
            {
                suche[i].gefunden += ret;
                printf(" in Zeile %d\n", zeile);
                ret = 0;
            }
        }
        printf("Suchergebnisse in \"%s\": %d\n", suche[i].name, suche[i].gefunden);
        printf(LINE);
        fclose(f);
    }

    return EXIT_SUCCESS;
}
Suchstring ist "ex" und das Muster ist "a example text". Bei mir ist das Suchergebnis 0, aber es müsste größer als 0 sein. Hier die Ausgabe:
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Brute-Force-Algorithmus

Beitrag von nufan » Do Jun 20, 2019 3:43 pm

Hallo! :)

Laut deinem Screenshot übergibst du "d:/test.txt" als Suchstring, ich vermute da liegt das Problem. Dieser Parameter sollte wirklich der Suchstring selbst sein, nicht eine Datei.

Ansonsten habe ich deinen Code kopiert und bei mir getestet - funktioniert wie erwartet.

Xeon
Beiträge: 169
Registriert: So Dez 17, 2017 4:10 pm

Re: Brute-Force-Algorithmus

Beitrag von Xeon » Fr Jun 21, 2019 12:44 pm

Danke nufan, jetzt geht es bei mir auch.

Antworten