Visual C++ CString :: Delete

Dieses Thema Visual C++ CString :: Delete im Forum "Windows XP Forum" wurde erstellt von Don_Pazo, 5. Okt. 2005.

Thema: Visual C++ CString :: Delete Hallo, ich habe in einen CString Datensätze gespeichert. Meinen CString enthällt sehr viele unnütige Daten die...

  1. 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);
    
     
Die Seite wird geladen...

Visual C++ CString :: Delete - Ähnliche Themen

Forum Datum
Digittrade DVB-T Stick Visual C++ Runtime Fehler Windows 7 Forum 25. Okt. 2014
fehlermeldung von visual c++ runtime library Windows XP Forum 23. Nov. 2011
Probleme mit Visual C++ Windows XP Forum 27. Okt. 2011
Visual C++ 2005 x86/x64 Error 1935 Software: Empfehlungen, Gesuche & Problemlösungen 13. Juni 2011
Visual Studio 2010 und .NET Framework 4 Beta 2 Windows XP Forum 5. Nov. 2009