Suche via Schleife
-
Hallo,
ich stehe momentan vor einem Problem.
Habe die Aufgabe, eine Methode zu schreiben, die einen charString (Array) nach einem Word (charString [array]) durchsucht und dann den Index ausgibt, wo das Wort im String anfängt.Lösung soll via char text[255]; usw. erfolgen.
Hier mein momentaner Quellcode:
// Includes usw. // findWord-Funktion int findWord(char text[], char word[]) { int textLength = strlen(text); int wordLength = strlen(word); for(int i = 0; i <= textLength; i++) { if(text[i] == word[0]) { for(int y = 0; i <= wordLength; i++) { if (text[i+y] != word[y]) { break; } } return i; } return -1; } }
// Main-Funktion int _tmain(int argc, _TCHAR* argv[]) { // Variablendeklaration char text[255]; char wort[255]; FILE *file; char filename[255]; // Dateinamen einlesen printf("Bitte den Dateinamen eingeben: "); scanf("%s", &filename); // Datei öffnen file = fopen(filename, "r"); if(file != NULL) { while (!feof(file)) { // Die Datei auslesen fscanf(file, "%s", &text); printf("Datei erfolgreich geöffnet.\n"); printf("Bitte Suchwort eingeben: "); scanf("%s", &wort); findWord(text, wort); if(findWord(text, wort) == -1) printf("Nicht gefunden."); else printf("Gefunden an Stelle."); } } else { // Wenn die Datei nicht geoeffnet werden konnte, printf("Datei konnte nicht gefunden werden."); } getch(); return 0; }
Für Tipps wäre ich dankbar.
Es soll unbedingt mit 2 Schleifen sein, nicht mit der Fkt strstr.Edit:
Ich vermute mal, dass ich das "return" an die falsche Stelle gesetzt habe.
Oh, sorryHab ich vergessen:
Also, er ruft die Methode auf, sagt aber immer, dass "Nicht gefunden" wurde.
Entweder hab ich einen Denkfehler in den Schleifen, oder halt 'nen Fehler mit dem "return".Vielen Dank!
-
ich stehe momentan vor einem Problem.
Vielleicht wolltest du uns auch sagen, wo das Problem eigentlich liegt?
-
Ok, dein Edit hilft mir weiter. Versuch's so:
// Includes usw. // findWord-Funktion int findWord(char text[], char word[]) { int textLength = strlen(text); int wordLength = strlen(word); for(int i = 0; i <= textLength; i++) { if(text[i] == word[0]) { for(int y = 0; i <= wordLength; i++) { if (text[i+y] != word[y]) { break; } } if (i == wordLength) return i; } return -1; } }
-
Danke für die schnelle Hilfe.
Der Code geht so leider nicht.
Er sagt mir "Nicht gefunden", trotz dass das Wort beinhaltet wird.Vielleicht auch ein Verständnisfehler.
Wenn die "break"-Anweisung ausgeführt wird, springt er dann in die übergeschachtelte Schleife, oder bleibt er in der selben Schleife?
-
Du vergleichst immer ein Zeichen zu viel, nimm jeweils < statt <= (und außerdem mußt du in dem innersten Schleifenkopf y verwenden - statt i):
int findWord(char text[], char word[]) { int textLength = strlen(text); int wordLength = strlen(word); for(int i = 0; i < textLength; i++) { if(text[i] == word[0]) { for(int y = 0; y < wordLength; y++) { if (text[i+y] != word[y]) { break; } } if (y == wordLength) return i; // hier war auch noch ein Fehler! } return -1; } }
Und ansonsten benutz einen Debugger, um Schritt für Schritt durch das Programm zu gehen...
-
Wenn die "break"-Anweisung ausgeführt wird, springt er dann in die übergeschachtelte Schleife, oder bleibt er in der selben Schleife?
Er verläßt die erste übergeordnete Schleife und macht danach weiter. In meinem Beispiel springt er von Z 12 in Z 15.
Ich werd einmal den Compiler anwerfen, scheinbar wird heute nichts aus "eval inside".
-
@ TH69
Vielen Dank
Also die Problemchen hatte ich bereits behoben. Sind mir auch aufgefallen.Ich werd nun mal mit dem Debugger rumprobieren.
int findWord(char text[], char word[]) { int textLength = strlen(text); int wordLength = strlen(word); for(int i = 0; i < textLength; i++) { if(text[i] == word[0]) { for(int y = 1; y <= wordLength; y++) { if(text[i+y] != word[y]) { break; } } return i; } } return -1; }
So, soweit läuft es nun.
Jedoch macht er, wenn nun z.B. die Folge "st" zweimal im String vorkommt, gibt er den Index des ersten vorkommenden "st" aus.
-
Ja, und was erwartest du jetzt?
Wenn du den letzten String haben willst, dann mußt du von hinten an suchen.
Wenn du alle Vorkommen haben willst, dann mußt du dir ein Array erzeugen...
-
Üblicherweise wird man das btw mit Zeigern formulieren.
Du hättest natürlich auch einmal im Internet suchen können -- hier die ersten beiden Google-Treffer für strstr source:http://www.tek-tips.com/viewthread.cfm?qid=1173833&page=7
http://cvsweb.xfree86.org/cvsweb/cvs/lib/strstr.c?rev=HEADDie erste Variante schaut ein bißchen dirty aus, verwendet aber gar keinen Funktionsaufruf.