Splitfunktion Mfc



  • hallo,

    folgender String muss gesplittet werden:

    Idealfall:

    "Argument1" """Argument2"" Argument2" """Argument3"" ""Argument3""";

    Gesplittet wird beim Hochkomma " und die Strings werden in ein Vector geschrieben. Folgende Elemente stehen dann im Vector:

    1. Element: Argument1
    2. Element: "Argument2" Argument2
    3. Element: "Argument3" "Argument3"

    Ein einfaches Hochkomma gibt an, dass ein Argument geöffnet oder
    geschlossen wird. Folgt einem Hochkomma ein weiteres Hochkomma
    bedeutet das, dass das Argument mit einem Hochkomma abgespeichert wird.

    Mein Quellcode funktioniert auch soweit - aber nur für den Idealfall.
    Wenn aber zB. ein Argument nicht geöffnet oder geschlossen wurde, funzt es nicht!

    zB. "hallo" "hier
    Ausgabe: "hallo" ("hier wird ignoriert)

    oder "hallo" hier"
    Ausgabe: "hallo" hie

    Hier mein Quellcode:

    void CHelfDialogDlg::split(vector <CString> &vec, const CString &test, char such)
    {
    stack <char> hk;
    stack <char> ahk;

    CString temp;

    for (int pos=0; pos < test.GetLength(); pos++)
    {

    if(test[pos] == such)
    {
    if (! ahk.empty()) // Argument öffnen
    {
    if (hk.empty())
    {
    if(test[pos+1] == such) //Suche nach zweif. Hochkomma
    {
    hk.push(such);
    }

    if(test[pos+1] == 32)
    {
    ahk.pop(); //Argument schliessen
    }

    }
    else
    {
    if(test[pos-1] == such)
    {
    hk.pop();
    temp.Insert(temp.GetLength(),such); //anhängen des Hochkommas
    }

    }
    }
    else
    {
    ahk.push(such); //Argument oeffnen
    }
    }
    else
    {

    if (ahk.size() > 0 ) //Inhalt Argument einlesen
    {
    temp.Insert(temp.GetLength(),test[pos]);
    }

    if(ahk.size() == 0) //Inhalt Argument ohne hk einlesen
    {
    if(test[pos] != 32)
    {
    if((pos+1 == test.GetLength()) && (temp.GetLength() > 0))
    {
    temp.Insert(temp.GetLength(), test[pos]);
    vec.push_back(temp);
    temp.Delete(0, temp.GetLength());
    }
    else
    {
    if(test[pos+1] == such)
    {
    vec.push_back(temp);
    temp.Delete(0, temp.GetLength());
    }
    else
    {

    temp.Insert(temp.GetLength(), test[pos]);
    }
    }
    }
    else if (temp.GetLength() > 0)
    {
    vec.push_back(temp);
    temp.Delete(0, temp.GetLength());
    }

    }

    }

    }

    }

    Kann mir jemand weiterhelfen??

    Danke!

    Ciao pseo



  • Hallo,
    versuch mal das 😃

    void CHelfDialogDlg::split(CStringList *vec, CString *test, char such)
    {
        int
            i,
            beg,
            end;
    
        for(end = 0; ;)
        {
            beg = test->Find(such, end);
            i = beg +1;
            if((beg < 0) || (i >= test->GetLength()))
                break;
    
            for(;;)
            {
                end = test->Find(such, i);
                if(end < 0)
                    break;
    
                i = end +1;
                if(i < test->GetLength())
                {
                    if(test->GetAt(i) == such)
                    {
                        ++i;
                        if(i >= test->GetLength())
                        {
                            end = -1;
                            break;
                        }
                    }
                    else
                        break;
                }
                else
                    break;
            }
    
            if(end > beg)
            {
                vec->AddHead(test->Mid(beg +1, end - beg -1));
            }
            else
                break;
    
            end = i;
            if(end >= test->GetLength())
                break;
        }
    }
    

    😉 :p 😉



  • Hey ByteSlider !!

    erst einmal vielen Dank fuer Deine Muehe!
    Ich werde es jetzt ausprobieren!!!

    Also bis dann.

    Ciao pseo

    😮 🙂



  • Hallo ByteSlider;

    ich habe mit der Klasse CList noch nicht gearbeitet!
    Muss ich hier die Klasse implementieren und wenn ja, wo?

    Ach noch eine Frage. Weisst Du zufällig, wie ich die
    Reihenfolge meiner Tabindizes für meinen Dialog einstellen
    kann?

    Ciao pseo



  • Für die Liste #include <afxtempl.h> in stdafx.h einfügen und in die Hilfe gucken
    Für die Tabreihenfolge nur mal Strg+D drücken 😉



  • guten tag, lol 😉

    vielen Dank!

    Ciao pseo


Anmelden zum Antworten