Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Sttring parsen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
05.05.2006, 09:35 Uhr
law



Hallo ich habe folgendes Problem:

ich habe einen String in dem steht folgendes drin

{#
Parameter 1 2
#}
{#LISTAVINC
param 2 4
param 9 2
{#ENDLISTAVINC
{#
Parameter 1 2
#}


Ich würde nun gern eine Format prüfung realisieren und zwar möchte ich im String nach #End Suchen und wenn einmla #END gefunden wurde würde ich den string ger weiterlesen und mir den Rest vom END holen im Besipiel w#re das dann LISTAVINC

dann würde ich gern suchen ob {#LISTAVINC existiert.

hab keine Ahnung wir ich das machen könnte. Bin soweit das ich mit Find nach End suche und die Position im String bekomme , kann allerdings dann nur zeichen für zeichen auslesen. das müsste doch einfacher gehen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.05.2006, 10:22 Uhr
~gast
Gast


Hol dir das Token das (Position + 3) beginnt.
Vergleiche dann alle Token mit diesem.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.05.2006, 10:39 Uhr
~gast
Gast


Alle Token mit diesem vergleichen geht ja auch nicht wegen # !
Also an # das Token anhängen, das an (Position + 3) beginnt
und dann mit allen Token vergleichen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.05.2006, 10:43 Uhr
law



was soll mir das bringen ?

ich will nur wissen ob es zu {#ENDLISTAVINC auch {#LISTAVINC gibt

warum sollte ich dann nach #E suchen ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.05.2006, 10:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


er meint, such nach #, wenn dahinter dann END kommt oder LIS dann weißte was kommt
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.05.2006, 11:22 Uhr
law



mir geht es nicht da drum zuwissen was kommt ^^

ich will nur das format prüfen.

wenn ich den eintrag #endlista finde will ich auch nen eintrag #Lista finden.

es gibt auch noch mehrere solche blöcke mit verschiedenen namenzb
#tablora
#endtablora

usw..
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.05.2006, 09:48 Uhr
~gast
Gast



C++:
#include<iostream>

char* stok(char*);

int main()
{
    const char end[] = "END";
    char buf[] =
        "{#\nParameter 1 2\n#}\n{#LISTAVINC\nparam 2 4\n"
        "param 9 2\n{#ENDLISTAVINC\n{#\nParameter 1 2\n#}"
        "{#\nParameter 1 2\n#}\n{#_HELLO!\nparam 2 4\n"
        "param 9 2\n{#END_HELLO!\n{#\nParameter 1 2\n#}"
        "{#\nParameter 1 2\n#}\n{#MFG\nparam 2 4\n"
        "param 9 2\n{#ENDMFG\n{#\nParameter 1 2\n#}"
        "{#\nParameter 1 2\n#}\n{#ACHTER\nparam 2 4\n"
        "param 9 2\n{#ENDACHTER\n{#\nParameter 1 2\n#}"
        "{#\nParameter 1 2\n#}\n{#MXAI\nparam 2 4\n"
        "param 9 2\n{#ENDMAI\n{#\nParameter 1 2\n#}"
        "{#\nParameter 1 2\n#}\n{#2006\nparam 2 4\n"
        "param 9 2\n{#END2006\n{#\nParameter 1 2\n#}";
    char* mystr = buf;
    while(mystr)
    {
        char* ende = 0;
        char* anfang = 0;
        ende = strstr(mystr, end);
        if(!ende)
            break;
        anfang = strstr(mystr, stok(ende+(sizeof end-1)));    
        if(!anfang)    
            std::cout << "<<<< Anfang nicht gefunden" << std::endl ;
        else
           std::cout << stok(anfang+1) << std::endl;
           std::cout << stok(ende) << std::endl << std::endl;
         mystr = strstr(mystr, end) +(sizeof end-1);
    }  
    return 0;
}
    char* stok(char* str)
    {
        if(!str)
            return 0;
        const char seps[] =  " \n\t";
        static char  token[256];
        memset(token, 0, 256);
        token[0] = '#';
        int b;
        for(int i = 0; i < 256; i++){    
            for(b = 0; b < 4; b++)
                if(str[i] == seps[b])
                    break;
            if(str[i] != seps[b])    
                token[i+1] = str[i];
            else
                break;
       }
       return token;
    }

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.05.2006, 09:53 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


nimm lieber gleich strtok_r statt deiner "unsafen" stok/strtok lösung, falls strtok_r nicht vorhanden ist, das hier nehmen:


C++:
char * strtok_r (char *s, char *delim, char **lasts)
{
    register char *spanp;
    register int c, sc;
    char *tok;

    if (s == NULL && (s = *lasts) == NULL)
        return (NULL);

    /*
     * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
     */

cont:
    c = *s++;
    for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
        if (c == sc)
            goto cont;
    }

    if (c == 0) {        /* no non-delimiter characters */
        *lasts = NULL;
        return (NULL);
    }
    tok = s - 1;

    /*
     * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
     * Note that delim must have one NUL; we stop if we see that, too.
     */

    for (;;) {
        c = *s++;
        spanp = (char *)delim;
        do {
            if ((sc = *spanp++) == c) {
                if (c == 0)
                    s = NULL;
                else
                    s[-1] = 0;
                *lasts = s;
                return (tok);
            }
        } while (sc != 0);
    }
    /* NOTREACHED */
}



Auch wenn da ein goto drin ist, aber schliesslich ist das von 1988
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.05.2006, 11:07 Uhr
xXx
Devil


hmm mach doch noch das goto raus... also ich find das immer sehr hässlich in nem code...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: