Problem mit strstr

Schnelle objektorientierte, kompilierende Programmiersprache.
do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Problem mit strstr

Beitrag von do6dm » Mo Feb 06, 2012 6:44 pm

Ich hab leider schon wieder ein Problem.^^
Also ich soll die Funktion char * strstr(char *string, char *needle); "nachprogrammieren".
Zusätzlich soll ich durch "erschöpfendes Testen" sofort einen Nullzeiger zurückgeben, falls needle länger als string ist... Weil dann kann ja needle nie in string drin sein. Das hab ich glaub soweit gelöst.
Mein Problem ist jetzt, wie ich nach mehreren chars ,die ja auch in der richtigen Reihenfolge in string sein müssen, was ich ja auch prüfen muss, suchen soll. Hat jemand nen Tipp?
Hier mal mein Code soweit:

Code: Alles auswählen

char * my_strstr(char *haystack, char *needle);

int main(){
    
char string[] = "aa123aa";
char needle[] = "123";
char *ptr;
ptr = my_strstr(string, needle);

printf(" %c ", ptr);
    
    system("PAUSE");
    return 0;
}

char * my_strstr(char *haystack, char *needle){
     while((int)(strlen(haystack))-(strlen(needle)) >=0){   //erschöpfendes Testen?
      hier wäre mein code :)
     }
     return NULL;
}
Edit: Hätte ich dafür nen neuen Thread aufmachen sollen? Ist besser falls es jemand anderst auch sucht, aber andererseits Spam ich das Forum voll. :D

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: Problem mit strtok

Beitrag von do6dm » Di Feb 07, 2012 2:56 pm

Oder kann ich so: return NULL; überhaupt einen Nullzeiger zurückgeben?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Problem mit strstr

Beitrag von Xin » Di Feb 07, 2012 3:06 pm

do6dm hat geschrieben:Mein Problem ist jetzt, wie ich nach mehreren chars ,die ja auch in der richtigen Reihenfolge in string sein müssen, was ich ja auch prüfen muss, suchen soll. Hat jemand nen Tipp?
Zwei verschachtelte Schleifen?
do6dm hat geschrieben:

Code: Alles auswählen

char * my_strstr(char *haystack, char *needle){
     while((int)(strlen(haystack))-(strlen(needle)) >=0){   //erschöpfendes Testen?
      hier wäre mein code :)
     }
     return NULL;
}
Warum while?
do6dm hat geschrieben: Edit: Hätte ich dafür nen neuen Thread aufmachen sollen? Ist besser falls es jemand anderst auch sucht, aber andererseits Spam ich das Forum voll. :D
Neues Problem, neuer Thread.
do6dm hat geschrieben:Oder kann ich so: return NULL; überhaupt einen Nullzeiger zurückgeben?
Genauso so macht man das. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: Problem mit strstr

Beitrag von do6dm » Di Feb 07, 2012 4:34 pm

Okay, nach 1,5 Stunden hab ich es :D
While hab ich durch if ersetzt, das war falsch, ja.

Funktionieren tut es, aber ich glaub das ist in sachen Performance und Lesbarkeit ne ziemliche Katastrophe :(

Code: Alles auswählen

char * my_strstr(char *haystack, char *needle){
     char *rueckgabe;
     int i, j, k;
     if((int)(strlen(haystack)-strlen(needle)) >=0){  //erschöpfendes testen
            for(i=0; i< (int)strlen(needle); i++){    //schleife für needle
                  for(j=0; j < (int)strlen(haystack); j++){ //schleife für haystack
                           k=0;                             
                  hay:              if(needle[i] == haystack[j]){
                                           i++;
                                           j++;
                                           k++;
                                           if(k == (int)strlen(needle)){
                                                rueckgabe = haystack+(j-k);
                                                return rueckgabe;
                                           }    
                                           goto hay;
                                    } 
                        }  
             }                   
     }
    return NULL;
}
An wen muss ich denn den Kasten Bier schicken, als Anerkennung, wenn ich die Prüfung bestehe? ;-)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Problem mit strstr

Beitrag von Xin » Di Feb 07, 2012 4:41 pm

do6dm hat geschrieben:Funktionieren tut es, aber ich glaub das ist in sachen Performance und Lesbarkeit ne ziemliche Katastrophe :(
Ich habe nichts gegen goto, aber Du bekommst hier absolutes Goto-Verbot!
Wer bringt Dir sowas bei!?

Ja, es ist eine Katastrophe. Jeder Funktionsaufruf kostet. Also wenn sich die Länge von needle und haystack nicht laufend verändern, dann nimm eine Variable nl (needleLength) und eine hl (heystackLength) und dann kann man das ganze auch lesen.

Weiterhin suchst Du den passenden Heuhaufen für die Nadel.

Lass mich das anders formulieren. Code wegwerfen und dann nicht überlegen, wie Du Programmcode erzeugst, der tut, was Du willst, sondern überlege Dir genau, was Du tun willst.
Und das beschreibst Du hier. Und zwar auf Deutsch. Ganz detailliert.
Finde "ana" in "Banane". Was musst Du tun?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: Problem mit strstr

Beitrag von do6dm » Di Feb 07, 2012 5:04 pm

Es funktioniert auch garnicht sehe ich gerade.. wenn ich nach a123 in aa123aa suche kommt der gute Nullzeiger :(

Also: Ich würde gerne "ana" in "Banane" suchen. Dazu muss ich doch erst in "Banane" suchen, bis mal das erste Zeichen von meinem Suchwort, also a, vorkommt. (Wäre Zeichen Nummer 2)
Dann muss ich das nächste Zeichen in meinem Suchwort, also n, mit dem nächsten Zeichen von "Banane" (Wäre Zeichen Nummer 3), vergleichen.
Dann das 3. Zeichen im Suchwort, also a, mit dem 4. Zeichen in "Banane", vergleichen. Das mach ich solange, bis ich die volle Länge meines Suchworts "ana" mit "Banane" verlichen habe.

Bisschen übersichtlicher:
- Suche in "Banane" nach "a". --> Zeichen 1 in "ana" / Zeichen 2 in "Banane"
- Vergleiche Zeichen 2 in "ana" mit Zeichen 3 in "Banane
- Vergleiche Zeichen 3 in "ana" mit Zeichen 4 in "Banane
- Vergleiche so lange bis Länge von "ana" erreicht ist.
- Sollte oben ein Zeichen von "ana" ungleich Zeichen von "Banane" sein > Liefere Nullzeiger.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Problem mit strstr

Beitrag von Xin » Di Feb 07, 2012 5:08 pm

Okay, nun suche "ane" in "Banane"
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: Problem mit strstr

Beitrag von do6dm » Di Feb 07, 2012 5:17 pm

Oje, das würd mit meiner Version nicht gehen, weil ich schon längst nen Nullzeiger hätte, bis ich überhaupt bei "ane" in Banane angekommen wär.^^
Ich müsste also wenn ich keine übereinstimmung gefunden habe, im String weiter nach dem nächsten "a" suchen und dann wieder Zeichen für Zeichen vergleichen?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Problem mit strstr

Beitrag von Xin » Di Feb 07, 2012 5:28 pm

So sieht's aus. Sobald der Vergleich mit der Needle fehlschlägt, weißt Du, dass die Needle "ane" nicht an diesem ersten "an" beginnt. Du musst also weiterziehen.

Statt laufend zu fragen, wie lang ein String ist, hilft Dir vermutlich auch die Tatsache, dass am Ende des Strings ein Nullbyte ist.

Also... wir suchen noch die "ane" in der Banane.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: Problem mit strstr

Beitrag von do6dm » Di Feb 07, 2012 5:38 pm

Dann such ich jetzt weiterhin nach dem a, wenn meine darauffolgenden Vergleiche fehlschlagen, gehe ich in "Banane" eins weiter und schau wieder ob da ein a ist, wenn nicht, wieder in "Banane" eins weiter usw. Falls ich wieder ein a finde, führe ich meinen vergleich wieder aus. Und dann kontrollier ich noch mir while oder so, wann in meinem Banane string das Nullbyte kommt und liefer dann ggf. das Nullbyte.

Antworten