Stringklasse



  • Abend zusammen, ich sitze gerade am += Operator meiner Stringklasse. Sieht im Moment so aus (gekürzte Fassung ohne Zeigerprüfung und Co.)

    MYSTRING& operator += ( const char *s )
    {
      ...
      size_t n = strlen( s );
      char *pTmp = new char[n +m_nSize +1];
      ...
      strcat( pTmp, m_pData );
      strcat( pTmp, s );
      ...
      delete [] m_pData;
      m_pData = pTmp;
      ...
      return *this;
    }
    

    Kann man das ganze noch etwas C++ konformer machen (speziell wegen strcat)? - und wenn ja wie?



  • ich habe sprintf verwendet, ist aber auch nicht so der hit. suche auch nach einer besseren lösung.

    MYSTRING& operator += ( const char *s )
    {
      sprintf(m_pData, "%s%s", m_pData, s);
      return *this;
    }
    

    der vorteil ich habe den operator überladen für mehrere typen, somit ist das
    inttostring kein problem mehr.

    MYSTRING& operator += (int i)
    {
      sprintf(m_pData, "%s%d", m_pData, i);
      return *this;
    }
    


  • Danke für die Antwort. Werde dann wohl vorerst bei strcat bleiben. strcat ist in meinem Fall dann doch etwas schneller als sprintf.



  • Vielleicht mal überlegen, was strncat eigentlich macht ?
    Und dann kannst du dir selber was eventuell schnelleres 🙄 zum kopieren bauen.



  • Statt strcat kannst Du std::copy verwenden:

    #include <algorithm>
    ...
    std::copy( m_pData, m_pData + m_nSize, pTmp);
    std::copy( s, s + n + 1, pTmp + m_nSize);
    

    Allerdings musst dann selbst aufpassen, wie und wo Dein \0 mitkopiert wird (strcat macht das für Dich, copy nicht). Wenn m_nSize inklusive \0 ist, dann musst Du ein Element weniger kopieren.

    In Deinem Beispielcode verlässt Du Dich darauf, dass in pTmp[0] = '\0' ist. Ansonsten hat das erste strcat nicht den gewünschten Erfolg. Besser wäre es beim ersten Kopieren ein strcpy zu nehmen.


Anmelden zum Antworten