Substrings



  • Guten Abend,

    mir bereitet eine kleine Sache schon geraume Zeit Probleme.
    Ich habe eine Funktion "substrings", die mir aus einem vorgegebenen String (Rokokokomode) die Anzahl der vorkommenden Teilstrings (oko) und Pointer an deren Stelle zurückgeben / speichern soll.

    Innerhalb der Funktion scheint alles reibungslos zu klappen, d.h. ich kann mir die Substrings ausgeben lassen.
    Versuche ich das in der main-Methode gibt es einen Laufzeitfehler - das Programm stürzt ab.

    Ich hoffe jemand kann helfen.

    Nachfolgend der Code:

    #include<stdio.h>
    
    int getLength(char *str)
    {
       int i;
       for(i = 0; str[i]; i++);
    
       return i;
    }
    
    //Liefert die Anzahl der Vorkommen eines Substrings in dem vorgegebenen String
    //In ptr werden die pointer an den jeweiligen Stellen gespeichert.
    int substrings(char *str, char *substr, char **ptr)
    {
       int i, j, count = 0, substrLength = getLength(substr);
       ptr = (char **)malloc(sizeof(str));
    
       for(i = 0; str[i]; i++)
       {
          for(j = 0; j < substrLength && substr[j] == str[i + j]; j++);
    
          if(j == substrLength)
             ptr[count++] = &str[i];
       }
    
       for(i = 0; i < count; i++)
          printf("%s\n", ptr[i]);
    
       return count;
    }
    
    int main(int argc, char **argv)
    {
       char *a = "Rokokokommode", *b = "oko", **p;
       int k = substrings(a, b, p);
       int i = 0;
    
       printf("%d\n", k);
    
       for(;i < k; i++)
          printf("%s \n", p[i]);
    
       free(p);
    
       return 1;
    }
    

    Vielen Dank schonmal! 🙂



  • Dein malloc reserviert zuwenig Speicher.



  • Praktisch bekomme ich aber eine Ausgabe, wieso wird dort zu wenig Speicher reserviert?
    (Ich habe mal den Speicher mit dem Faktor 8 (für Adressen) und einmal mit 1000 (um definitiv genug Speicher zu haben) multipliziert und bekomme immer noch einen Laufzeitfehler, evtl. liegt es also nicht daran.)



  • ptr ist eine lokale Variable in substrings. Auch wenn sie als Argument übergeben wurde.

    Das p (aus main) soll auf ein neuen Speicherbereich zeigen. Dazu musst du die Adresse von p an substrings übergeben.

    Lass dir mal die Werte von p und ptr ausgeben. Dazu gibt es %p bei printf.



  • Versuche nicht, deine eigenen Fehler zu bewerten ("macht nichts...", "läuft doch...", "Compiler meldet keinen Fehler...",...), eliminiere alle deine erkannten Fehler, und versuche zu begreifen.
    Danach kannst du auf die Suche der restlichen Fehler gehen.



  • Danke an euch beide für die Vorschläge zur Lösung des Problems (bzw. danke dir Wutz für den allgemeingültigen Tipp.).


Anmelden zum Antworten