Visual C++ CString :: Delete

  • #1
D

Don_Pazo

Bekanntes Mitglied
Themenersteller
Dabei seit
16.09.2005
Beiträge
112
Reaktionspunkte
0
Hallo,

ich habe in einen CString Datensätze gespeichert. Meinen CString enthällt sehr viele unnütige Daten die zwischen < > Klamer stehen.
Dazu will ich meinen CString bereinigen.

Ich habe versucht mit der Funktion CString::Delete () leider mache ich irgendwas fallsch, kann mir jemand bitte helfen?
Was habe ich falsch bei der Funktion gemacht, und wie kann ich es gut machen ?

CString strTextKopi;

strTextKopi = m_strText; // initialisiren (public: m_strText)

laenge = strTextKopi.GetLength(); // Länge ermitteln

laenge = laenge -1;
for(laenge; laenge > 0; laenge--)
{
if (strTextKopi[laenge] ==->>')
{
zu_index = laenge;
}


if (strTextKopi[laenge] ==-><')
{
auf_index = laenge;
index = 1;
}

if (index == 1)
{
strTextKopi.Delete(auf_index, zu_index);
index = 0;
}
}
 
  • #2
Ohne Dein Grundprinzip zu verändern (nur als Beispiel; überprüfe besser, ob es stimmt):

Code:
/*
Entfernt Tags aus einem String, die mit dem Zeichen-><' beginnen und mit->>' enden.
Der String darf leer sein.
Die Tag-Struktur darf fehlerhaft sein.
Wenn ein Fehler auftritt, wird der String nicht verändert.
*/
bool RemoveTags(CString& string, int& removedTags, int& openBrackets, int& closedBrackets) {

  CString strTextKopi(string);
  int laenge = strTextKopi.GetLength();

  // Falls Du es nicht gemacht hast, solltest Du in Deinem Code zu_index initialisieren. Was würde
  // sonst - selbst wenn alles andere stimmen würde und Du bei Delete die Läge berechnen würdest -
  // bei so einem String: abc < passieren? Zumindest im Prinzip nichts Gutes, aber CString::Delete ist
  // ja hart im Nehmen ;).
  int zu_index;

  // Hier besser bool und ein sinnvoller Name
  bool srchOpenTag= false;

  // Damit Du feststellen kannst, ob ein Fehler aufgetreten ist
  bool ok= true;
  // Und noch ein paar Extrainformationen
  int rmvdTags= 0, cntOpen= 0, cntClosed= 0;

  // Eigene Indexvariable->pos', da->laenge' ja kein laufender Index ist,
  // sondern die Stringlänge angibt.
  // Außerdem >= 0, nicht >0, da sonst das erste Zeichen nicht berücksichtigt wird
  for(int pos= laenge - 1; pos >= 0; pos--) {
    if (strTextKopi[pos] ==->>') {
      cntClosed++;
      // Fehlerprüfung
      if(srchOpenTag) {
        ok= false;
        break;
      }
      zu_index = pos;
      srchOpenTag= true;
    }

    if (strTextKopi[pos] ==-><') {
      cntOpen++;
      // Fehlerprüfung
      if(!srchOpenTag) {
        ok= false;
        break;
      }
      // Delete erwartet als 2. Parameter eine Länge, keinen Index.
      // Es wäre effizienter, anstatt Teile mitten im String zu löschen,
      // die übrigen Teile an einen String anzuhängen. Aber in diesem Fall dürfte das
      // letztlich egal sein, da der Anwender keinen Unterschied bemerken würde.
      strTextKopi.Delete(pos, zu_index - pos + 1);
      rmvdTags++;
      srchOpenTag= false;
    }
  }

  if(cntOpen != cntClosed)
    ok= false;

  openBrackets= cntOpen;
  closedBrackets= cntClosed;

  if(ok) {
    removedTags= rmvdTags;
    string= strTextKopi;
  } else
      removedTags= 0;

  return ok;
}

// Die Version für faule Leute ;)
bool RemoveTags(CString& string) {
  int removedTags, openBrackets, closedBrackets;
  return RemoveTags(string, removedTags, openBrackets, closedBrackets);
}

Code:
int removedTags, openBrackets, closedBrackets;
CString text(m_strText);
CString message;

bool res= RemoveTags(text, removedTags, openBrackets, closedBrackets);
if(!res)
  message= Fehler: Tag-Struktur ist ungültig.;
else
  message.Format(%d Tags entfernt.\n%s, removedTags, text);

// Hinweis: Für Deinen Zweck müsstest Du wahrscheinlich noch unnötige Whitespaces entfernen.
AfxMessageBox(message);
 
Thema:

Visual C++ CString :: Delete

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.965
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben