split funktion



  • Hi Leute!

    Ich hab eine split Funktion geschrieben. Diese soll aus

    char text[] = "Dies:ist:ein:Text"
    split(text,':');

    einzelne Wörter mit Nullterminierung '\0' machen. Dies\0 ist\0 ein\0 Text\0.
    Ich verwende ein multidim. Array in der Funktion in der die einzelnen Wörter samt \0 gespeichert werden. Das klappt auch wunderbar nur das Problem ist wie bekomme ich sie wieder AUS der Funktion?

    Ich möchte keine printf Ausgaben in der Funktion, da es ja sonst eine DisplayArray Funktion wäre.

    Schön wäre es wenn ich in in der Main Funktion
    char neuesArray[][] = split(text,':'); machen könnte.

    Wobei mir am allerliebsten ein Pointer Array wäre..nur da spielt VSC++2008 nicht mit.

    Ich hab schon versucht das multdim. Array als Pointer zu returnen aber wie assigne ich es dann in Main? hmm vielleicht steh ich auf der Leiung..

    Wäre Euch sehr Dankbar für Tips und Ratschläge (keine fertige Funktion bitte 😉 )

    Greetings

    cLover



  • Schau dir mal malloc() und free() an.
    Damit kannst du Speicherplatz für deinen 2D-Array reservieren
    und den Pointer dann an die main übergeben (nachdem du ihn befüllt hast)
    Der Speicher den du mit malloc() anforderst ist auch noch in der main gültig
    muss aber irgendwann mit free() wieder freigegeben werden.
    Sonst hast du einen MemoryLeak.



  • Vielen Dank!

    ja mit malloc könnte ichs mal probieren.

    also wenn ich so überlege könnte es drei Möglichkeiten geben

    char *split(char *dst, char delim, char *ergebnisUeberHeap)
    
    char *split(char *dst, char delim, char *ergebnis[])
    

    oder

    char *split(char *dst, char delim, char ergebnis[][])
    

    nur das mit den returns von 2D Arrays oder pointer arrays ist mir noch nicht so klar..

    Greetings

    Tom



  • #include <stdio.h>
    
    struct split
    {
      char *pointers[256];
      int count;
    };
    
    struct split split (char *in, char delim)
    {
      struct split sp;
      sp.count = 1;
      sp.pointers[0] = in;
    
      while (*++in)
      {
        if (*in == delim)
        {
          *in = 0;
          sp.pointers[sp.count++] = in+1;
        }
      }
    
      return sp;
    }
    
    int main()
    {
      char text[] = "Dies:ist:ein:Test";
      struct split sp = split (text, ':');
      int s;
    
      for (s=0; s<sp.count; s++)
        puts (sp.pointers[s]);
    }
    

    🙂



  • danke für die "fertige" Funktion. Ich würde aber dennoch gerne wissen wie ich mit meiner Funktion auch zum Ziel kommen würde..

    es muss doch irgendeine möglichkeit geben ein 2D oder ein pointer array zu returnen und das ganze in main zu verwenden!? 😕



  • cLover schrieb:

    es muss doch irgendeine möglichkeit geben ein 2D oder ein pointer array zu returnen und das ganze in main zu verwenden!?

    komplette arrays kann man nur zurückgeben, wenn man sie in structs verpackt. siehe den code da^^ der macht das auch.
    🙂



  • fricky schrieb:

    cLover schrieb:

    es muss doch irgendeine möglichkeit geben ein 2D oder ein pointer array zu returnen und das ganze in main zu verwenden!?

    komplette arrays kann man nur zurückgeben, wenn man sie in structs verpackt. siehe den code da^^ der macht das auch.
    🙂

    Du kannst einen NULL terminierten char** zurückgeben.



  • komplette arrays kann man nur zurückgeben, wenn man sie in structs verpackt. siehe den code da^^ der macht das auch.

    hmm und wie sieht es mit der Rückgabe von Pointer Arrays aus?



  • cLover schrieb:

    komplette arrays kann man nur zurückgeben, wenn man sie in structs verpackt. siehe den code da^^ der macht das auch.

    hmm und wie sieht es mit der Rückgabe von Pointer Arrays aus?

    gib nen char** zurück.



  • char** Split ( const char* StringToSplit );
    

    oder

    int Split ( char ***arr, const char* StringToSplit  );
    

Anmelden zum Antworten