CString zu LPTSTR konvertieren



  • Hallo
    Ich möchte von CString zu LPTSTR konvertieren und finde in folgender Funktion keinen Fehler:

    LPTSTR text=NULL;
    int len=str.GetLength();
    TCHAR* buffer=new TCHAR[len)];
    
    for(int i=0;i<=len;i++)
    {
    	buffer[i]=str.GetAt(i);
    }
    
    text=finbuffer;
    MessageBox(text);
    delete [] buffer;
    

    Der String wird korrekt angezeigt, aber der Debugger meldet : HEAP CORRUPTION DETECTED ... , nach der Messagebox.(Prog stürzt nicht ab)
    Also stimmt irgendwas mit delete nicht 😕

    Im Release Modus klappt alles wunderbar



  • Mich iritiert die Klammer: 😕

    TCHAR[len)]
    

    Und mach mal

    i<len
    

    sonst rennt der über die Grenze!



  • Vor allem benötigst du Platz für ein Zeichen mehr als dir GetLength() ausspuckt, um den Null-Terminator darin unterzubringen (der wird üblicherweise nicht mitgezählt, wird allerdings von den üblichen Stringverarbeitungs-Funktionen benötigt).



  • Danke für die Antworten.
    So klappt es jetzt

    int len=str.GetLength()+1;
    
    TCHAR* buffer=new TCHAR[len];
    
    for(int i=0;i<len;i++)
    {
    	buffer[i]=str.GetAt(i);
    }
    text=buffer;
    MessageBox(text);
    
    delete [] finbuffer;
    


  • sollte das nicht automatisch gehen? ich glaube, CString stellt eine konversion zur verfügung:

    LPCSTR xy = (LPCSTR)cstring;
    

    versuchs mal, vielleicht klappts ja, dann bist du das los 🙂



  • Wozu benötigst du eigentlich noch eine zusätzliche Variable? Schreib doch gleich "MessageBox(buffer);".

    PS: Da MessageBox auch mit einem konstanten Pointer leben kann, ist die ganze Umwandelei nur unnötige Zeitverschwendung:

    MessageBox(str);
    


  • MessageBox ... ? Ah, gar nicht gelesen 🙂
    Klar, das ist am einfachsten!



  • Ich meinte nicht LPCSTR sondern LPTSTR.
    Und das mit MessageBox ist nur ein Test



  • Hallo,
    das geht schon, auch mit LPTSTR, ich meine die Umwandlung von CString nach LPTSTR.

    CString csTest = "Forum";
    LPTSTR szTest;
    szTest = (LPTSTR&) csTest;
    AfxMessageBox(szTest); // Testausgabe!
    

    Oder hab ich das was falsch verstanden?? 😕
    mfg
    pixel



  • es sollte im allgemeinen am geschicktesten sein, die makros bzw. eingebaute funktionalität der mfc-klassen zu verwenden. sonst kommst du irgendwann in echte schwulitäten - stichwort unicode, etc. es sei denn, du hast tatsächlich volle kontrolle über den gesamten erzeugungsprozess der von dir verwendeten strings.
    und wenn dir die klassen schon die konversionen abnehmen - warum dann noch mit den byte-werten rumschlagen?


Anmelden zum Antworten