CString zerstören



  • Nexus schrieb:

    In C++ würde ich auch zu std::string raten, dort hast du die Memberfunktion clear() fürs Leeren zur Verfügung.

    Falls leeren nur das erste Element auf Null setzt

    #include <string>
    #include <iostream>
    using namespace std;
    
    int main()
    {
       string str = "Ich bin ein string";
       cout << str;
       memset ((void*)str.c_str(), 0, str.length());
       str = "";
       cout << str;
    }
    


  • C++Fan 2010 schrieb:

    memset ((void*)str.c_str(), 0, str.length());
    

    Keine gute Idee, mal eben schnell const wegzucasten. In C++ sollte memset() wie viele andere C-Konstrukte (z.B. der C-Cast) mit Vorsicht eingesetzt werden.

    Wenn du alle aktuell gültigen Elemente eines std::string s auf 0 setzen willst, geht das auch ohne undefiniertes Verhalten:

    std::fill(str.begin(), str.end(), '\0');
    


  • Phisherman schrieb:

    Vielen Dank.
    Ich lerne C++ in der Schule. Momentan erlernen wir den Umgang mit CStrings. Strings folgen noch.

    Du solltest lieber andere Begriffe verwenden, um Missverständnissen vorzubeugen. Du redest von C-Strings/char-Arrays und std::string. CString ist eine Klasse der MFC/ATL. Und Strings sind sie alle...



  • Nexus schrieb:

    Wenn du alle aktuell gültigen Elemente eines std::string s auf 0 setzen willst, geht das auch ohne undefiniertes Verhalten:

    std::fill(str.begin(), str.end(), '\0');
    

    Du hast recht. Das ist besser



  • _matze schrieb:

    Phisherman schrieb:

    Vielen Dank.
    Ich lerne C++ in der Schule. Momentan erlernen wir den Umgang mit CStrings. Strings folgen noch.

    Du solltest lieber andere Begriffe verwenden, um Missverständnissen vorzubeugen. Du redest von C-Strings/char-Arrays und std::string. CString ist eine Klasse der MFC/ATL. Und Strings sind sie alle...

    Außerdem finde ich es unglaublich, dass immer noch std::string als "Nachfolger von char[]" gelehrt wird.... (zumal es mir immer noch nicht einleuchtet, warum man Arrays nicht genausogut mit std::string (oder std::vector) lernen können sollte).
    Es ist doch viel motivierender, wenn sich Programmieranfänger nicht erst mit Speicherverwaltung rumschlagen müssen, bevor "sie was sehen können".

    bad habits never die...

    Gruß,

    Simon2.



  • Es sieht für mich mehr so aus, das du die CString Klasse aus der MFC benutzt. Der kannst du einfach einen Leerstring zuweisen:

    CString temp = "";
    


  • Burkhi schrieb:

    Es sieht für mich mehr so aus, das du die CString Klasse aus der MFC benutzt.

    Tja, das ist das Geheimnis, dass er endlich mal lüften sollte. 😃



  • _matze schrieb:

    Tja, das ist das Geheimnis, dass er endlich mal lüften sollte. 😃

    Aber dann wärs ja kein Geheimnis mehr. 😃 😃



  • Burkhi schrieb:

    Es sieht für mich mehr so aus, das du die CString Klasse aus der MFC benutzt.

    Dagegen spricht wahrscheinlich folgendes:

    Phisherman schrieb:

    Ich benutze die Funktion strcpy(ziel, quelle).

    Aber du hast Recht, es ist total mühsam, wenn man aufgrund ungenauer Fragestellung spekulieren muss.



  • Und dagegen spricht vor allem auch dies hier:

    Phisherman schrieb:

    Momentan erlernen wir den Umgang mit CStrings. Strings folgen noch.

    Ich habe noch von keinem Lehrer gehört, der erst (bzw. überhaupt) CString und dann noch std::string behandelt. Nö, sein Lehrer wird im Unterricht zu char-Arrays C-Strings gesagt haben, und er hat das einfach hier als "CString" niedergeschrieben.


  • Administrator

    Nexus schrieb:

    Burkhi schrieb:

    Es sieht für mich mehr so aus, das du die CString Klasse aus der MFC benutzt.

    Dagegen spricht wahrscheinlich folgendes:

    Phisherman schrieb:

    Ich benutze die Funktion strcpy(ziel, quelle).

    Leider nicht. CString ist nur ein typedef auf CStringW oder CStringA, welche wiederum nur ein typedef auf ein CStringT mit entsprechenden Templateparametern sind. CStringT erbt von CSimpleStringT, welcher einen impliziten Konvertierungsoperator anbietet:
    http://msdn.microsoft.com/en-us/library/tk1z2hd9.aspx

    Ist die MFC nicht nett? 🤡

    Allerdings wurden wohl schon die C-Strings gemeint. Unteranderem wegen dem Argument von _matze. So ganz 100% klar ist es allerdings wirklich nicht.

    Grüssli



  • @Dravere:
    Hast du das "C" in PCXSTR übersehen?
    Den Konvertierungs-Operator kann man zumindest nicht als Target von strcpy() verwenden.

    Natürlich gibt es immer noch CStringT::GetBuffer bzw. CStringT::GetBufferSetLength, mit denen geht das dann.



  • Phisherman schrieb:

    Ich benutze die Funktion strcpy(ziel, quelle).

    strcpy() überschreibt dir den C-String komplett. Ob der vorher "leer" ist, ist dabei vollkommen egal.

    Und falls du wirklich die CString Klasse aus der MFC verwenden solltest... diese mit strcpy() zu kombinieren würde ich einem Anfänger nicht wirklich empfehlen.


  • Administrator

    hustbaer schrieb:

    @Dravere:
    Hast du das "C" in PCXSTR übersehen?

    Nein, ich habe strcmp im Quote von Nexus gelesen. Scheiss C Funktionen mit ihren kurzen Namen 🤡

    Grüssli



  • Jetzt bin ich etwas verwirrt. Ich kann nur die Informationen liefern, die ich kenne.

    Laut der Aussage eines Lehrers wird erst der Umgang mit CStrings (also char-Arrays) gelehrt und später folgen die "C++ Strings", da man zur Programmierung von Fehlermeldungen CStrings benötige.

    Was ist denn die CString Klasse aus MFC?
    Ich weiß nur, dass bei manchen Compilern string.h oder cstring.h inkludiert werden muss.
    Vielleicht versteht ihr welchen String ich benutze, wenn ihr euch dieses Beispielprogramm anschaut.

    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    
    int main()
    {
        char feld[10]="Hallo"; //Das ist der CString
        char feld2[20]="Automat";
    
        strcat(feld2,feld1);
        cout<<feld2; //Ausgabe: AutomatHallo
    
        strcpy(feld2,feld1);
        cout<<feld2; //Ausgabe: Hallo
    
        cout<<"feld enthaelt "<<strlen(feld)<<" Zeichen";
        cout<<"\nund feld2 "<<strlen(feld2)<<" Zeichen.";
    }
    


  • Phisherman schrieb:

    Laut der Aussage eines Lehrers wird erst der Umgang mit CStrings (also char-Arrays) gelehrt [...] da man zur Programmierung von Fehlermeldungen CStrings benötige.

    Du brauchst in C++ fast gar nie C-Strings, zumindest nicht in der Weise, dass du manuell Speicher verwalten und Zeichen kopieren müsstest. Die Klasse std::string reicht sehr weit, falls du dennoch auf char -Arrays lesend zugreifen willst, gibt es die Funktion std::string::c_str() .

    Phisherman schrieb:

    Was ist denn die CString Klasse aus MFC?

    Nichts, was für dich momentan relevant wäre. MFC ist ein Framework für Windows, und dort gibt es eben einen Typen mit Namen CString . Aber das war nur Teil unserer Spekulation...

    Phisherman schrieb:

    Ich weiß nur, dass ich keine zusätzlichen Headerdateien inkludieren muss, um die Funktionen des CStrings zu benutzen.

    Auch das stimmt nicht, du brauchst den Header <cstring> . Nur weil deine Implementierung der Standardbibliothek diesen vielleicht indirekt über andere Header inkludiert, heisst das nicht, dass das immer gilt. Oder versuch mal ganz ohne Header mit strcpy() zu arbeiten.

    Phisherman schrieb:

    Vielleicht versteht ihr welchen String ich benutze, wenn ihr euch dieses Beispielprogramm anschaut.

    Ja, es ist sicher nicht schlecht, wenn man mit C-Strings ( char -Arrays) umgehen kann, allerdings sollte das nicht zu grosse Priorität erhalten. In C++ wird üblicherweise mit std::string gearbeitet, weil Kapselung und geschlossene Funktionalität erhebliche Vorteile mit sich bringen.


Anmelden zum Antworten