CString zerlegen

visiondpc

Erfahrenes Mitglied
Hallo.
Ich versuche mich grade ein wenig in die MFC mit VC++ einzuarbeiten und habe ein Problem damit, einen Sting zu zerlegen. Die Suchfunktion war leider auch nicht ergiebig.
Es soll ein Text in ein Eingabefeld geschrieben werden. Die einzelnen Teile dieses Textes sind durch einen Seperator ( Semikolon bietet sich wohl an ) getrennt. Der String soll an diesen Stellen getrennt und und in eine Variable mit Array geschrieben werden um hinterher in Deierblöcken ausgegeben zu werden.
Ich glaube ich mache zum besseren Verständnis mal ein Beispiel.
Eingegebener Text
Code:
Satz 1;Satz 2;Satz 3;Satz 4;usw.
Die ausgabe sieht hinter dann so aus:
1. Satz 1
2. Satz 2
3. Satz 3

1. Satz 4
2. ...

Bisher habe ich es nur als Konsolenanwendung geschafft, wenn ich den text aus einem Dokument geholt habe.

Code:
while ( doc.eof()==false ) // ich weiß eof ist decreased. Ich habs aber so gelernt
    {
          getline ( doc, s_text, ';');
          i++;
          s_textzw[i]=s_text;
    }
    for ( j=0 ; j<=i ; j+3 )
    {
        s_ausgabe=s_ausgabe+"1. "s_textzw[j]+"\n2. "+s_textzw[j+1]+"\n3. "+s_textzw[j+2]+"\n\n";
    }

Kann mir jemand helfen, wie ich das umsetze um in der MFC den String zu zerlegen?
DANKE für die Hilfe.
 
Falls du ein aktuelles Visual Studio (2003 oder 2005) mit entsprechend aktueller MFC hast, kannst du den CString-Member Tokenize verwenden. Ansonsten könntest du mit dem Member "Find" die Semikolons suchen und mit "Mid" die Teilstrings separieren; oder den String zeichenweise parsen und so die entsprechenden Teilstrings herauslösen.
Die Zerlegung von Strings ist eigentlich ein gängiges Thema mit verschiedenenen Lösungsmöglichkeiten. Es wundert mich, das du da nichts Brauchbares gefunden hast.

Gruß
MCoder
 
Danke für die Antwort. Ich arbeite mit Visual Studio 6. Bisher habe ich mit MFC´s überhaupt keine Erfahrung und C++ an sich behersche ich auch nur die Grundlagen. Deswegen wußte ich nicht genau wonach ich suchen sollte und unter "String" oder " String zerlegen" habe ich kein beispiel gefunden, mit dem ich etwas anfangen konnte.
 
Ich habe versucht das Problem mit CString::Find und Mid zu lösen aber irgendwo ist da noch der Wurm drin.

CString out[] liefert mir aus irgend einem Grund keinen Wert zurück.

Code:
	int pos=0, pos_start=0, i=0, j=0;
	CString out[4];

	while(true)
	{ 
		pos = m_content.Find(";", pos_start);

		if(pos == -1)
        break;
		else
		{
			out[i] = m_content.Mid(pos_start, m_content.GetLength() - pos);
			pos_start = pos+1;
			i++;
		}
	}
	
	for ( j=0 ; j<=i ; j=j+3 )
    {
        s_fullstring=s_fullstring+"1. "+out[j]+"\n2. "+out[j+1]+"\n3. "+out[j+2]+"\n\n";
    }
 
Zuletzt bearbeitet:
Dass "out" keinen Wert liefert, kann ich nicht ganz nachvollziehen. Dein ursprünglicher Splitting-Algorithmus ist zwar nicht ganz korrekt, sollte aber auf jeden Fall das Arrray befüllen. Dafür solltest du lieber ein dynamisches CStringArray nehmen, da die Anzahl der Eigabedaten ja wahrscheinlich auch variiert.
Ansonsten hat dir der Ausdruck "m_content.GetLength() - pos" ab dem Semikolon immer den gesamten Rest des Eingabestrings geliefert.
Hier die etwas modifizierte Variante:
C++:
CString m_content = _T("Satz 1;Satz 2;Satz 3;Satz 4;Satz 5;Satz 6");

int pos = 0, pos_start = 0;
CStringArray stringArray;

while( true )
{ 
    pos = m_content.Find(_T(";"), pos_start);

    if( pos == (-1) )
    {
        if( m_content.GetLength() > pos_start ) // Falls der letzte Eintrag nicht mit einem Semikolon endet
        {
            stringArray.Add(m_content.Mid(pos_start));                
        }

        break;
    }
    else
    {
        stringArray.Add(m_content.Mid(pos_start, pos - pos_start));
        pos_start = pos + 1;
    }
}

CString s_fullstring = _T("");

for ( int j = 0 ; j < stringArray.GetSize() ; j = j + 3 )
{
    s_fullstring += _T("1. ")        +
                    stringArray[j]   +
                    _T("\n2. ")      +
                    stringArray[j+1] +
                    _T("\n3. ")      +
                    stringArray[j+2] +
                    _T("\n\n");
}
Gruß
MCoder
 
Danke für die Arbeit. Ich habe das jetzt mal so übernommen. Kompilierung klappt ohne das Fehler oder Warnungen angezeigt werden. Wenn ich aber nach der Texteingabe auf Start klicke kriege ich folgende Meldung:

Debug Assertion failed!
...
File: afxcoll.inl
Line: 233
...
und danach:
Die Ausnahme "unknown software exeption" (0x80000003) ist an der Stelle 0x5f478ce9 aufgetreten.
...
 
Für den Absturz habe ich keine Erklärung, bei mir hat's funktioniert. Debugge doch mal schrittweise durch, um zu schauen an welcher Position da was passiert.
 
ich glaube ich hab gefunden, woran es liegt. Aber keine Idee wie ich es lösen könnte.

Der Fehler sitzt in der for-Schleife am Ende. Wenn ich die weglasse funktioniert es.
Anscheinend kann die Aktion in der Schleife nur einmal ausgeführt werden. Ich hab zum Spaß mal als Abbruchbedingnung j<=i genommen dann es. i ist ja an der Stelle auch noch NULL. Wenn ich i in der Vorhergehenden while-Schleife hochzählen lasse, hängt er sich wieder auf.

edit: Habs nochmal einzeln getestet. Abbruchbedingung für j darf max. 2 sein. Also wirklich nur einmal durchlaufen die Schleife. Das sieht fast so aus, als würde der mit dem Array nicht so ganz klarkommen.Ich habs mal versucht abzuändern aber das passt mit Add ( kein bestandteil von CString ) wieder nicht. Wird die Funktion vieleicht bei VS6 nicht in dieser Form unterstützt?
 
Zuletzt bearbeitet:
Du musst in der letzten for-Schleife sicherstellen, dass bei jedem j-Wert noch 3 Einträge im CStringArray adressiert werden können. Bei einem solchen String "Satz 1;Satz 2;Satz 3;Satz 4;" kann die z.B. die Schleife nur einmal durchlaufen werden, weil die Indizierungen [j+1] und [j+2] auf Array-Elemente verweisen, die gar nicht da sind. Dadurch ensteht wahrscheinlich der Absturz. Du musst also die Abbruchbedingung bzw. die Schleifenkonstruktion mal in der Richtung überprüfen.
 
Also die Abbruchbedingung diesbezüglich zu ändern birngt nichts. +
Wie genau kann ich denn die stringArray Variable bearbeiten?
Ich habe das jetzt so als Zusatz in die Schleife mit eingebaut:
Code:
if stringArray[j+1]="";
	{
		stringArray[j+1]=".";
	}
	if stringArray[j+2]="";
	{
		stringArray[j+2]=".";
	}
Ergebnis: "Synatxfehler Bezeichner Stringarray".
 

Neue Beiträge

Zurück