C++ Knutt Morris Pratt

Ich benötige ein Programm mit welchem ich ein Muster in einem digitalen code finde. Das ist nicht schwierig, nur bin ich beim kmp algorithmus gelandet den ich leider nicht in c++ umsetzten kann. gibt es etwas einfacheres?

Ein string soll aus einer Datei eingelesen werden und mit einem Muster verglichen werden. Das Programm sollte das Muster an verschiedenen Stellen des Strings erkennen. That’s it.
brauche hilfe…am besten einen tip oder ein komplettes programm.
Danke, danke.
Veit

Hallo,

Ich benötige ein Programm mit welchem ich ein Muster in einem
digitalen code finde. Das ist nicht schwierig, nur bin ich
beim kmp algorithmus gelandet den ich leider nicht in c++
umsetzten kann. gibt es etwas einfacheres?

Wenn ich mit Google suche, finde ich da auf der ersten Trefferseite eine Erklärung inklusive „working C++ source code which might help you understand the algorithm better.“:
http://www.ics.uci.edu/~eppstein/161/960227.html

Reicht das?

Grüße,
Mo „regex“ ritz

Noch was…
Hallo,

Ich benötige ein Programm mit welchem ich ein Muster in einem
digitalen code finde. Das ist nicht schwierig, nur bin ich
beim kmp algorithmus gelandet den ich leider nicht in c++
umsetzten kann. gibt es etwas einfacheres?

Die C-Funktion strstr macht genau das, und ziemlich effizient (ein selbstgeschriebener, nicht optimierter KMP kann da normalerweise nicht mithalten).

Sofern die Aufgabe ist, in einem String einen Teilstring zu finden. Wenn nicht musst du dich ein bisschen klarer ausdrücken.

Grüße,
Moritz

Danke, Moritz ich setz mich nochmal an die Aufgabe und meld mich bald mit klarer ausgedrückten Fragen :smile:
gruß,
Veit

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Moritz,
so, jetzt hab ich ein programm mit strstr geschrieben. Ich krieg die Ausgabe nicht hin. Das Programm soll die Anzahl der gefundenen Muster und ihre stelle im eingegeben Text ausgeben. Mit der LoopAusgabe hab ich es probiert…ist aber nicht das Ware.
Kannst Du mir da weiterhelfen.
Gruss,
Veit

#include
#include
#include
#include
#include
using namespace std;

int main()
{
char text[100];
char pat[100];
char *pch;
memset (text, 0, 100);
memset ( pat, 0, 100);

//ifstream datei(„test.txt“);
//datei.read(text, 50);

cout >text;
cout >pat;

pch=strstr(text,pat);
cout

Hallo,

so, jetzt hab ich ein programm mit strstr geschrieben. Ich
krieg die Ausgabe nicht hin. Das Programm soll die Anzahl der
gefundenen Muster und ihre stelle im eingegeben Text ausgeben.
Mit der LoopAusgabe hab ich es probiert…ist aber nicht das
Ware.

Was heisst „nicht das Ware“? Was bekommst du, und was willst du bekommen?

Kannst Du mir da weiterhelfen.
Gruss,
Veit

> pch=strstr(text,pat);  
> cout


Wenn die Pattern nicht überlappen dürfen, darfst du nicht nur um 1 weitergehen, sondern musst um die Länge des Patterns weitergehen.
Beispiel: text = "ababab", pattern = "abab".
In deiner Schleife gäbe es zwei matches - ist das erwünscht?

Grüße,
Moritz

Ich hab mich falsch ausgedrückt…
Ein Array hat Speicherplätze-[0],[1],[2] etc
Mein Programm soll die stellen der Speicherplätze wiedergeben an dem das Muster im Text gefunden wurde. Besser noch, von/bis zu welcher Position das Muster steht.
z.B
Text: abbaaba
Muster:aba

Ausgabe:
1 Muster gefunden
Position:4 bis 6

Vielen Dank nochmal für die Hilfe.
Gruß,
Veit

Guter Tip mit dem sprung des Musters um seine eigene Länge im Text…
Hab es mit strlen gelöst- ist das gut so?

#include
#include
#include
#include
#include
using namespace std;

int main()
{
char text[100];
char pat[100];
char *pch;
memset (text, 0, 100);
memset ( pat, 0, 100);
// ifstream datei(„test.txt“);
// datei.read(text, 50);
cout>text;
//cout >pat;
pch=strstr(text,pat);
cout

Hallo,

Ein Array hat Speicherplätze-[0],[1],[2] etc
Mein Programm soll die stellen der Speicherplätze wiedergeben
an dem das Muster im Text gefunden wurde. Besser noch, von/bis
zu welcher Position das Muster steht.

Das Problem ist, dass Arrays eine feste Größe haben - und du weißt vorher nicht, wie viele Treffer es gibt.

Dafür gibt es mehrere Möglichkeiten:
a) Eine verkettete Liste
b) Eine wachsendende Datenstruktur aus der SDL
c) Ein Array, und das mit realloc zu vergrößern.

Grüße,
Moritz

Dafür gibt es mehrere Möglichkeiten:
a) Eine verkettete Liste
b) Eine wachsendende Datenstruktur aus der SDL
c) Ein Array, und das mit realloc zu vergrößern.

Grüße,
Moritz

Welche ist denn nun die trivialste Möglichkeit?

Hi Moritz,
hab das Problem einfacher gelöst:

#include
#include
#include
#include
#include
using namespace std;

int main()
{
char text[3000];
char pat[3000];
char *pch;
memset (text, 0, 1000);
memset ( pat, 0, 1000);

//ifstream datei(„test.txt“);
//datei.read(text, 100);
//cout>text;

cout>pat;

pch=strstr(text,pat);
int textlen=strlen(text);

int n=1;

while(pch !=NULL)
{
char i;
char * count;
count=pch;
int len=strlen(pat);
pch=strstr(pch+len,pat);
//cout

…das genügt vorerst.:smile:
Danke nochmal für deine Hilfe.
Gruß,
Veit