Problem bei Strings



  • Guten Abend,

    ich habe folgendes Problem:

    ich möchte meiner Main Methode eine Zeichenkette übergeben

    z.b ==> "das hier ist bla bla eine Zeichenkette bla bla"

    ausserdem übergebe ich eine zweite Zeichenkette oder Buchstaben
    z.b ==> "bla"

    jetzt suche ich nach einem Algorithmus der die Zeichenkette sucht und angibt wie oft dieser vorkommt in diesem Beispiel währen es bei "bla" ja 4 mal !!

    Ganz wichtig ist noch das ich nur mit Pointer arbeiten darf. die Funktion heisst findstring und sieht bis jetzt so aus

    #include <string.h>
    int findstring(char ** c1, char * c2){ // muss so bleiben
    int zaehler=0;

    for(int i =0; i<strlen(c1[0]);i++){
    printf("%s\n",c1[0]+i);
    if(strstr(c1[0]+i,c2))
    { zaehler++;

    printf("GEFUNDEN =====> %s \n",c1[0]+i);
    }

    }
    c1[0]++; c2++;

    return zaehler;

    }

    ich komme einfach nicht weiter da er in diesem fall ja so lange von links nach rechts geht und den zaehler immer hochzählt dadurch bekomme ich eine zu hohe zahl.

    Hier nochmal die Beschreibung der Aufgabe von Doktor :

    Die Funktion findstring() soll folgende Funktionalität besitzen:
    + Funktionsparameter: die Adresse eines Zeigers, der auf den Anfang der
    Zeichenkette / des Speichers zeigt, sowie die Adresse der zu suchenden
    Teilzeichenkette
    Prototyp: int findstring(char **, char 😉
    + Rückgabewerte: über den ersten Übergabeparameter wird die vorletzte
    gefundene Adresse der Teilzeichenkette zurück gegeben (NULL, wenn keine
    vorletzte Adresse vorhanden); der Rückgabewert der Funktion (return) soll die
    Anzahl der gefundenen Teilzeichenketten erhalten
    + Eine Teilzeichenkette kann mit der C-Funktion strstr() gesucht werden
    + Weitere Funktionalität soll die Funktion nicht besitzen

    danke im Vorraus


  • Mod

    Ungetestet, da im Kopf programmiert:

    vorletzter_fund = NULL
    letzter_fund = NULL
    anzahl_funde = 0
    
    suchposition = anfang der zu durchsuchenden Kette
    solange(suchposition = strstr(suchposition, zu suchende zeichenkette) nicht NULL ist)
    {
      vorletzter_fund = letzter_fund
      letzter_fund = suchposition
      erhöhe anzahl_funde um 1
      erhöhe suchposition um X
    }
    
    Setze c1 auf vorletzter_fund
    Gebe anzahl_funde zurück
    

    Dabei gilt noch zu klären, was X ist. Es gibt zwei sinnvolle Werte, aber aus der Aufgabenstellung ergibt sich nicht, welcher gesucht ist. Die beiden sinnvollen Werte sind 1 oder die Länge des zu suchenden Strings. Der Unterschied liegt bei Szenarien wie dem folgenden:
    Zu durchsuchende Zeichenkette: "blablabla"
    Zu suchende Zeichenkette: "blabla"
    Ist die gesuchte Antwort nun 1 oder 2? Ist die Antwort 1 gesucht, dann muss X gleich der Länge von "blabla" sein. Ist die Antwort 2 gesucht, dann muss X gleich 1 sein.



  • #include <string.h>
    int findstring(char ** c1, char * c2){
    int claenge= strlen(c2);

    char *vorletzter_fund=NULL;
    char *letzter_fund=NULL;
    int anzahl_funde=0;
    char *suchposition=c1[0];

    do{
    vorletzter_fund=letzter_fund;
    letzter_fund=c1[0];
    suchposition + claenge;
    anzahl_funde++;
    }

    while(suchposition == strstr(c1[0],c2)!=NULL);

    c1[0]=vorletzter_fund;

    printf("%s", vorletzter_fund);
    printf("%s", letzter_fund);
    return anzahl_funde;

    }


  • Mod

    Informatiker im All schrieb:

    ...

    Das wird nicht funktionieren. Beweis: Lass es laufen.



  • Es funktioniert aber nicht so wie es soll 😃

    hier unten tut er jetzt was nur er zählt wieder zu viel sprich er betrachtet immer die ganze Zeichenkette und bekommt dadurch immer wieder eine falsche Anzahl des Vorkommens

    er soll ==>> durchsuchende "blablabla" gesuchte "blabla" == 2 ergeben

    Siehst du den Fehler ?

    danke für die Hilfe

    #include <string.h>
    int findstring(char ** c1, char * c2){
    int claenge= strlen(c2);

    char *vorletzter_fund=NULL;
    char *letzter_fund=NULL;
    int anzahl_funde=0;
    char *suchposition=c1[0];
    int i =0;
    while((suchposition = strstr(c1[0]+i,c2))!=NULL){
    vorletzter_fund=letzter_fund;
    letzter_fund=c1[0];
    suchposition ++;
    anzahl_funde++;
    i++;
    }

    c1[0]=vorletzter_fund;

    printf("%p\n", vorletzter_fund);
    printf("%p\n", letzter_fund);
    return anzahl_funde;

    }


  • Mod

    Informatiker im All schrieb:

    Siehst du den Fehler ?

    Ja, natürlich. Aber da ich schon eine Lösung gepostet habe, die ziemlich sicher funktionieren wird, sehe ich nicht den Mehrwert, deinen Vorschlag noch weiter zu korrigieren. Das Ergebnis wäre am Ende dann ja doch etwas, was meinem Vorschlag entspricht. Zumal es sehr mühsam wäre, die Fehlerzeilen zu benennen, da du deinen Code nicht formatierst. Fang doch direkt mit meinem Vorschlag an!



  • SeppJ schrieb:

    Informatiker im All schrieb:

    Siehst du den Fehler ?

    Ja, natürlich. Aber da ich schon eine Lösung gepostet habe, die ziemlich sicher funktionieren wird, sehe ich nicht den Mehrwert, deinen Vorschlag noch weiter zu korrigieren. Das Ergebnis wäre am Ende dann ja doch etwas, was meinem Vorschlag entspricht. Zumal es sehr mühsam wäre, die Fehlerzeilen zu benennen, da du deinen Code nicht formatierst. Fang doch direkt mit meinem Vorschlag an!

    Ich danke die es hat geklappt !!

    #include <string.h>
    int findstring(char ** c1, char * c2){

    char *vorletzter_fund = NULL;

    char *letzter_fund = NULL;

    int anzahl_funde = 0;

    char *suchposition = c1[0];

    while((suchposition = strstr(suchposition , c2)) != NULL){
    printf("%s\n", suchposition);

    vorletzter_fund=letzter_fund;

    letzter_fund=suchposition;

    suchposition ++;

    anzahl_funde++;

    }

    c1=vorletzter_fund;

    printf("%p\n %p\n",letzter_fund, vorletzter_fund);

    return anzahl_funde;

    }


  • Mod

    Du hast die Rückgabe über c1 nicht korrekt durchgeführt. Das habe ich im Pseudocode nicht technisch detailliert vorgemacht, aber bei der tatsächlichen Lösung muss man es natürlich richtig machen.



  • SeppJ schrieb:

    Du hast die Rückgabe über c1 nicht korrekt durchgeführt. Das habe ich im Pseudocode nicht technisch detailliert vorgemacht, aber bei der tatsächlichen Lösung muss man es natürlich richtig machen.

    da weiss ich leider nicht wie du das meinst bzw. der Prof. Denn ich habe ja bereits einen Rückgabewert der ja die Anzahl der Funde ist.

    wie wäre es denn korrekt? kann man zwei Rückgabewerte ausgeben?


  • Mod

    Du selber schrieb:

    + Rückgabewerte: über den ersten Übergabeparameter wird die vorletzte
    gefundene Adresse der Teilzeichenkette zurück gegeben
    (NULL, wenn keine
    vorletzte Adresse vorhanden); der Rückgabewert der Funktion (return) soll die
    Anzahl der gefundenen Teilzeichenketten erhalten

    Hervorhebung durch mich. Es kam garantiert im Kurs dran, wie man über einen Zeigerparameter einen Wert nach draußen bekommt, sonst wäre es nicht Teil der Aufgabe. Hast du dich denn nicht über die Vorgabe gewundert, dass c1 ein char** anstatt eines char* sein soll?

    Tipp: Wahrscheinlich wurde behandelt, wie man mittels eines Zeigers einen nicht-Zeiger zurück geben kann. Natürlich gilt das auch eine Stufe weiter, d.h. mittels eines Zeigers auf einen Zeiger, kann man einen Zeiger zurück geben.


Anmelden zum Antworten