Announcement

Collapse
No announcement yet.

String zerteilen ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • String zerteilen ?

    Nabend,


    ich kenne mich mit C++ noch nicht besonders gut aus, deswegen habe ich eine Frage bezüglich der zerteilung eines Strings.
    Ein String sieht folgendermaßen aus:

    [01/31/05 11:33:44,__init__,INFO] Loading plugins...

    Ich habe mir bereits die Left, Right und Mid Funktionen angeschaut, allerdings kann statt INFO eine andere Meldung im String stehen.

    Welche Funktion wäre denn dafür zu gebrauchen ?


    gruss

  • #2
    Hi phpdev,

    was genau hast Du vor?

    Hier mal ein kleiner Code...

    Code:
    #include "stdafx.h"
    
    using namespace System;
    using namespace System::Text;
    
    
    int main(array<System::String ^> ^args)
    {
    	StringBuilder^ sb = gcnew StringBuilder("01/31/05 11:33:44,__init__,INFO");
    
    	Console::WriteLine("{0}",sb->Remove(0,27));
    
    	String^ anzeige = "01/31/05 11:33:44,__init__,Test";
    
    	Console::WriteLine("{0}",anzeige->Remove(0,27));
    	
        return 0;
    }

    In beide Beispiele, werden die linken Zeichen abgeschnitten und der Code ausgegeben...

    Gruß, Doug_HH

    Comment


    • #3
      Danke für deine schnelle Antwort.

      Ich möchte Zeit, Datum, Modul, Typ und Meldung in jeweils einer Variable speichern.
      Zeit und Datum hab ich mit Left() und Right() etwas umständlich "rausgeschnitten", da aber die anderen Angaben immer unterschiedlich lang sein können muss ich mir da irgenwas einfallen lassen.

      Achja, ich benutze Visual C++ 6.0

      Comment


      • #4
        Der String ist doch zweimal zu trennen:

        Einmal an den Kommata und ein zweites Mal mit dem ersten Teil am Leerzeichen um Datum und Uhrzeit zu bekommen. Haben diese immer die gleiche Länge, kann man sich das zweite Trennen sparen und mit LEFT bzw. RIGHT des ersten Teiles arbeiten.

        Also in einer Schleife

        die Kommata suchen,
        sofern eines gefunden
        den String bis dahin herauslösen

        dann im zweiten Schritt aus dem ersten Teil das Datum und die Uhrzeit extrahieren.


        VC kennt dafür keinen Befehl?? split o.a.?
        Christian

        Comment


        • #5
          Datum und Uhrzeit bekomme ich auch ohne Probleme raus

          Nur fehlt dann noch __init__,INFO] Loading plugins...

          Statt INFO und der nachfolgenden Meldung kann aber etwas anderes stehen, also entweder länger oder kürzer.

          Mit welcher Funkton kann ich denn den String bis zum "]" auslesen ?
          Das würde mir ja schonmal helfen.

          EDIT: Achja, ganz vergessen zu erwähnen, ich arbeite an einer MFC Anwendung und muss somit CString verwenden.
          Zuletzt editiert von phpdev; 08.12.2007, 00:28.

          Comment


          • #6
            irgendwie reden wir aneinander vorbei:

            Es gibt in der Regel keinen Befehl um einen String "bis irgenwas" zu lesen. Grundsätzlich gibt es

            Nimm was von Links
            Nimm was von Rechts
            Nimm was aus der Mitte
            Ermittle die Position des Zeichen X in einem String

            Damit lassen sich alle Probleme mehr oder weniger komfortabel lösen. Weitere Befehle solltest du in der Hilfe zu CString nachlesen (http://msdn2.microsoft.com/en-us/lib...88(VS.90).aspx und insbesondere http://msdn2.microsoft.com/en-us/lib...89(VS.90).aspx und http://msdn2.microsoft.com/en-us/lib...d2(VS.90).aspx ).

            Insofern kann ich mich nur wiederholen

            Also in einer Schleife

            die Kommata suchen,
            sofern eines gefunden
            den String bis dahin herauslösen


            Willst du dann einzelne Stück zusammen fügen kannst du das tun. Willst du dann noch einzlene Zeichen löschen (wie bsp. die ]) kannst du da auch tun.

            Also den Ablauf in logische Schritte zerlegen und hintereinander ablaufen lassen -> nicht alles zusammen und auf einmal. Erst alle in die Teile aufteilen, dann die einzelnen Teile -sofern nötig- bearbeiten.

            Diesde Routine für den C++Builder (die Klasse String) mag als Vorlage dienen http://www.marquardtnet.info/cecke/q...quicky_01.html
            Christian

            Comment


            • #7
              Funktionieren würde auch das hier:

              // Der String, der zerlegt wird
              CString str = "[01/31/05 11:33:44,__init__,INFO] Loading plugins...";
              const int StartOffsetDatum = 1; // Datum/ Uhrzeit immer an gleichem Offset
              const int StartOffsetUhrzeit = 10; // Datum/ Uhrzeit immer an gleichem Offset

              char *strpos1, *strpos2; // Positionen innerhalb des Strings

              CString Datum = str.Mid(StartOffsetDatum, 8); // Datum auslesen
              CString Uhrzeit = str.Mid(StartOffsetUhrzeit, 8); // Uhrzeit auslesen

              strpos1 = strchr(str, ','); // Erste Komma suchen
              strpos2 = strchr(++strpos1, ','); // Nächstes Komma suchen
              // Wert für Modul zwischen den beiden Kommata
              CString Modul = str.Mid(strpos1 - (LPCSTR)str, strpos2 - strpos1);

              strpos1 = strchr(++strpos2, ']'); // Eckige Klammer suchen
              // Wert für Typ zwischen letztem Komma und eckiger Klammer
              CString Typ = str.Mid(strpos2 - (LPCSTR)str, strpos1 - strpos2);

              strpos1 = strchr(strpos1, ' '); // Nach Blank suchen
              CString Meldung = str.Mid(++strpos1 - (LPCSTR)str); // Wert für Meldung nach Blank das dem Typ folgt

              Ciao
              Compiguru

              Comment


              • #8
                Ok, es geht auch einfacher, wenn auch nicht unbedingt lesbarer (ich liebe scanf & Co)!

                char *str = "[01/31/05 11:33:44,__init__,INFO] Loading plugins...";

                char Datum[10], Uhrzeit[10], Modul[100], Typ[100], Msg[200];

                memset(Datum, 0x00, sizeof(Datum));
                memset(Uhrzeit, 0x00, sizeof(Uhrzeit));
                memset(Modul, 0x00, sizeof(Modul));
                memset(Typ, 0x00, sizeof(Typ));
                memset(Msg, 0x00, sizeof(Msg));

                // Kleine Erklärung:
                // [%s bedeutet ignoriere die [ am Anfang und nehme dann den String (bis Leerzeichen)
                // %[^,] bedeutet lese alles als String bis zum Komma (inkl. Whitespace)
                sscanf(str, "[%s %[^,],%[^,],%[^]]] %[^*]", Datum, Uhrzeit, Modul, Typ, Msg);

                Ciao
                Compiguru
                Zuletzt editiert von compiguru; 13.12.2007, 15:37.

                Comment

                Working...
                X