CString::Mid mit falschen indizes



  • ich musste eine Klasse hier von den MFC CStrings auf std::string umbauen, dabei hab ich alle Mid() Aufrufe durch substr und alle Empty() Aufrufe durch empty() und GetLength() durch length() ersetzt. Dachte damit wär's getan, jetzt bekomm ich aber out of range exceptions zur Laufzeit.
    Seh ich das also richtig, dass CString::Mid einfach einen leeren String zurückgibt wenn man ihn mit falschen Indizes aufruft? Wenn ja ist das nirgendwo dokumentiert oder was? Hab's nämlich nicht gefunden. Oder woran kann das liegen?


  • Mod

    Das ist explizit nicht dokumentiert.
    Aber CString kennt keine falschen Parameter. Negative Werte werden gegebenfalls als 0 interpretiert. Sind Längen oder Indexe zu groß wird der Bereich auf den Zugegriffen wird als leer angenommen.

    Es gibt keine "falschen" Parameter bei CString.



  • Sowas dämliches 😕 👎
    Danke für die Infos.



  • Naja, das sollte ja nun einfach zu lösen sein. Beispielsweise

    #include <cmath>
    #include <iostream>
    #include <string>
    
    std::string mid(std::string const &s, int first, int count) {
      return s.substr(std::min(static_cast<int>(s.size()), std::max(0, first)), count);
    }
    
    int main() {
      std::cout << mid("foobar", 2, 3) << std::endl;
      std::cout << mid("foobar", 1000, 3) << std::endl;
      std::cout << mid("foobar", -2, 3) << std::endl;
    }
    
    // Ausgabe:
    //
    // oba
    // 
    // foo
    

  • Mod

    anfängerpeter schrieb:

    Sowas dämliches 😕 👎

    Was ist daran dämlich?
    Ich muss ehrlich sagen, dass dies ein Grund ist (neben vielen anderen) warum ich ungern sd::string nutze. CString ist losgelöst aus der MFC und als Template verfügbar... Also warum es nicht nutzen wie std::string?


Anmelden zum Antworten