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" hieHier 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 dasvoid 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