String mehrfach splitten



  • Hallo liebe Profis,
    ich habe gerade neu mit C angefangen.
    Nun würde ich gerne eine Datei auslesen, und die Inhalte (für mich) sinnvoll in strings mit arrays speichern. (Falls das hier auch geht...)
    Ich habe die Datei schon öffnen können, und auch Zeilenweise auslesen.
    Doch nun stellt sich das Problem, dass in einer Zeile mehrere Daten sind, die ich gerne benutzen würde.
    So ist eine Zeile aufgebaut:

    <beispiel id="test" bsp1="false" bsp2="1234" bsp3="0" bsp4="0" bsp5="123.456124" bsp6="-1234.5678" bps7="12345.67897" bsp8="0.0" bsp9="784.457" bsp10="0" />
    

    Nun würde ich gerne einen char machen, der ungefähr so aufgebaut ist:
    char Beispiel[ANZHAL_ZEILEN][INHALT_ZEILEN];
    Ich würde dann die Inhalte der Zeile (Immer nur das zwischen den " ) darein schreiben, sodass ich es später noch nutzen kann.

    Ich hoffe ihr versteht was ich meine 🙂
    PS: Wie oben schon geschrieben, habe ich gerade erst mit dieser Programmiersprache angefangen. Basiswissen in PHP ist vorhanden, aber hier ja nutzlos 😃

    Gruß Hauke, und danke im voraus 🙂



  • Ob das einfach geht, hängt u.a. davon ab ob:
    - immer diegleiche lückenlose Reihenfolge deiner Tags existiert
    - ob die '\"' geklammerten Werte selbst auch Leerzeichen enthalten können
    - ob die die Werte als String benötigst oder gleich als spezieller Typ



  • Danke für deine Antwort
    Zu 1:
    Es sind niemals Lücken vorhanden.
    Zu 2:
    Leerzeichen sind auch nicht dadrinne. Nur so, wie es im Beispiel steht.
    Zu 3:
    Als String wäre es für mich am brauchbarsten.
    Hauptsache, ich würde das überhaupt erstmal gesplittet bekommen 🙂

    Gruß Hauke



  • Sehr einfach:

    char buffer[ZEILEN][TAGS][MAXSTR],
    str[]="<beispiel id=\"test\" bsp1=\"false\" bsp2=\"1234\" bsp3=\"0\" ...",*p=str;
    int tag=0,zeile=0;
    
    while( p=strstr(p,"=\"") )
    {
      strncpy(buffer[zeile][tag],p+2,strchr(p+2,'\"')-p-1);
      strchr(buffer[zeile][tag++],'\"')=0;
      ++p;
    }
    

    Für Stringwerte ohne endendes '=' Zeichen und dann für jede weitere Zeile ebenso zzgl. ++zeile.



  • @Wutz
    strchr kann auch NULL zurück geben und Zeile8 macht nicht das, was du erwartest (im Grunde ist es ein NOOP). Außerdem fliegt der Code um die Ohren, wenn MAXSTR zu klein ist (du hast keine Überprüfung eingebaut) und strncpy ist sowieso eine blöde Funktion, die man eigentlich nie nutzen sollte (macht in vielen Fällen zu viel \0 oder gar zu wenig \0 ans Ende. Ich weiß echt nicht, was sich das Komitee bei strncpy gedacht hat).



  • Danke für die Antwort.
    Der Code Funktioniert so leider auch nicht. (gibt Errors)
    Ich habe in der 8 Zeile noch ein = mehr gemacht, dann kommen keine Errors, doch es funktionier irgendwie auch nicht.



  • Es fehlte noch ein '*':
    http://codepad.org/4o8Lcypj

    Und noch kürzer und vielleicht auch verständlicher:
    http://codepad.org/888hcClv

    Die Dimensionierung musst du selbst gestalten entsprechend deinen Anforderungen und bei Variante 2 auf die Initialisierung achten.



  • Super, funktioniert mit deiner Vorgabe schon toll 🙂

    Wie bekomme ich denn ein char Beispiel[123]; da rein?



  • ? Indem du

    p = Beispiel;
    

    vor die while-Schleife setzt? Ich weiß nicht genau, was du meinst.



  • Tur mir leid, ich war gerade in Eile.
    Ich meine wie ich meinen String darein bekomme, der "zerlegt" werden soll.
    Der wird aus einer Datei geholt, und soll danach in eine andere Datei reingeschrieben werden, aber umformatiert.



  • Tut mir wirklich leid, dass ich nochmal posten muss, aber edit geht bei mir nicht.
    (Benutze safari, und es kommt immer, dass die Seite nicht gefunden wurde)

    Naja, auf jeden Fall habe ich nach einem bischen ausprobieren nun hinbekommen,
    meinen String einzufügen. Nun möchte ich, dass das gesplittete nicht ausgegeben wird, sondern nochmal gespeichert in einer Datei, aber das probiere ich jetzt erstmal. 🙂

    Danke schon mal bis hier 🙂



  • Tut mir wirklich leid, dass ich nochmal posten muss, aber edit geht bei mir nicht.
    (Benutze safari, und es kommt immer, dass die Seite nicht gefunden wurde)

    Naja, auf jeden Fall habe ich nach einem bischen ausprobieren nun hinbekommen,
    meinen String einzufügen. Nun möchte ich, dass das gesplittete nicht ausgegeben wird, sondern nochmal gespeichert in einer Datei, aber das probiere ich jetzt erstmal. 🙂

    Danke schon mal bis hier 🙂


Anmelden zum Antworten