Arraytrennung?



  • Wenn ich ein Array der Art

    char str[]="#typaBuch#typbHeft#typcCD#typdVHS";
    

    habe, wie kann ich es anstellen, dass wenn ich den Teil hinter "#typc" (allerdings dann effektiverweise auch nur "CD") haben will (und dann in ein neues Array kopieren will)?

    strtok() bringt in diesem Fall ja nicht sonderlich viel, da die Trennzeichen ja mehrere Zeichen bzw. unterschiedlich sind.
    Für einen kleinen Denkanstoss wäre ich durchaus dankbar 🙂



  • Der delimiter von strtok() ist ja selbst ein String, also kann man "#typ" wunderbar dafür verwenden. Das eine Zeichen dahinter wegzubekommen sollte ja auch kein unüberwindbares Problem sein.



  • Vielen Dank erst mal für die schnelle Antwort.

    Wäre es nur so einfach wie du sagst 🙄
    "typa", "typb" etc. sind jetzt nur angenommen, es kann auch passieren, das es ein Array der Art

    "#geraetMonitor FuSi#AutoRenault Laguna 2#baumFichte#taschentuchTempo"
    

    oder so ist 😉

    Habe ich vergessen zu erwähnen OK. Von daher meinte ich das strtok nicht viel bringen wird - oder ?



  • dann kannst du trotzdem mit strtok erstmal die # trennen
    dann musst du bei jedem token am anfang nach diesen strings suchen.
    da schreib dir am besten eine "begins()" funktion.

    oder du machst es so: "#geraet:Monitor FuSi#Auto:Renault Laguna 2#baum:Fichte#taschentuch:Tempo"
    dann musst du nur die #-token nochmal am doppelpunkt spalten.



  • c.rackwitz schrieb:

    oder du machst es so: "#geraet:Monitor FuSi#Auto:Renault Laguna 2#baum:Fichte#taschentuch:Tempo"
    dann musst du nur die #-token nochmal am doppelpunkt spalten.

    Das ist mal eine Idee die mal testen werden. Vielen Dank 🙂



  • noch besser gehts, wenn du einfach mit strstr(str,"#typc") nach dem eintrag suchst:

    char str[]="#typaBuch#typbHeft#typcCD#typdVHS";
         eintrag[]="#typc",
         ergebnis[100],
        *wert,
        *cp;
    int  wert_laenge;
    
    wert=strstr(str,eintrag); /*eintrag suchen */
    if(wert) /* wenn gefunden... */
    {
      wert+=strlen(eintrag); /* zeiger auf text hinter dem label bestimmen */
    
      if(cp=strchr(wert,'#')) /* ende des eintrages suchen */
        wert_laenge=strlen(cp);
      else
        wert_laenge=cp-wert;
    
      strncpy(ergebnis,wert,wert_laenge);
      ergebnis[wert_laenge]='\0';
    
      printf("der wert des eintrages %s ist %s\n",eintrag,ergebnis);
    }
    else printf("eintrag %s ist nicht vorhanden\n",eintrag);
    

    besser wäre aber, wenn du die einträge nicht mit '#' sondern mit '\0' trennen würdest. dann bräuchtest du das ergebnis nicht erst noch zu kopieren. du hättest dann schon mit dem zeiger auf das erste zeichen des ergebnisses einen nul-terminierten string! auch der ansatz von justme84 ist sinnvoll. also etwa so:

    char str[]="typa:Buch\0typb:Heft\0typc:CD\0typd:VHS";
    

    allerdings müsste die suche dann anders aussehen wie im obigen code.



  • Konfusius schrieb:

    auch der ansatz von justme84 ist sinnvoll. also etwa so:

    char str[]="typa:Buch\0typb:Heft\0typc:CD\0typd:VHS";
    

    allerdings müsste die suche dann anders aussehen wie im obigen code.

    Ähm das war aber der Vorschlag von c.rackwitz 🙂
    Deinen Code/Vorschlag werde ich auch mal bei Gelegenheit antesten - thx dafür!


Log in to reply