StrCopy



  • Hallo,

    das ist natürlich blödsinn, es muss natürlich

    char *Buffer;

    und dann

    Buffer = new char[30] sein.

    Das eigentliche Problem dürfte sein das StrCopy nicht den C-String terminiert. Du must also manuell nach dem Kopieren noch nach dem letzten gültigen Zeichen in Buffer ein '\0' setzen.

    Aha, schon merkwürdig das StrCopy, ich dachte durch das asBuffer.c_str() ist das ganze dann NULL terminiert.

    Was mir noch auffällt es fehlt manchmal auch ein Zeichen
    anstatt "ABCDE\x14" "ABCD\x14".

    Was noch auffällt, führe ich das StrCopy in einem Ereigniss aus z.B. in
    Edit Change steht zunächst meist das Richtige in Buffer, komme in dann in
    ein anderes Ereigniss z.B. Timer steht plötzlich was anderes drinn.

    Danke Dir



  • char a[20];
    AnsiString str = "Hallo world";
    strcpy(a, str.c_str());
    
    oder:
    
    AnsiString str = "Hallo world";
    char *a = new char[str.Length()+1];
    strcpy(a, str.c_str());
    //hier wird *a benutzt
    ....
    
    //Und am Ende
    delete []a;
    


  • hermes schrieb:

    Hallo,
    das ist natürlich blödsinn, es muss natürlich

    char *Buffer;

    und dann

    Buffer = new char[30] sein.

    Warum legst Du den Buffer mit new an? Wenn Du schon vorher weißt, wie groß er ist, kannst Du ihn doch auf den Stack packen: char Buffer[30]; Die 30 bytes machen es nun auch nicht mehr. Oder willst Du ihn durch die ganze App reichen?



  • [quote="witte"]

    hermes schrieb:

    Hallo,
    das ist natürlich blödsinn, es muss natürlich

    char *Buffer;

    und dann

    Buffer = new char[30] sein.
    Warum legst Du den Buffer mit new an? Wenn Du schon vorher weißt, wie groß er ist, kannst Du ihn doch auf den Stack packen: char Buffer[30]; Die 30 bytes machen es nun auch nicht mehr. Oder willst Du ihn durch die ganze App reichen?

    Klar geht auch 🙂



  • Hallo

    Sergey_Z schrieb:

    ...
    

    Auch hier gilt : lieber strncpy verwenden. Grund ist wieder Verhinderung von Buffer Overflow.

    bis bald
    akari



  • Spiele gerade mit StrLCopy rum.

    StrLCopy(Buffer,asBuffer.c_str(),20) und es wird wieder ab und zu nicht mit
    NULL terminiert sonder mit 0x14 manchmal fehlt sogar ein Zeichen.

    asBuffer "ABCDE"

    Buffer "ABCDE" oder "ABCDE\x14" oder "ABCD\x14" der übergebene asBuffer
    ist doch durch das asBuffer.c_str() eindeutig NULL terminiert wo soll den nun
    noch ein Problem sein, die Funktion muss da doch nur kopieren kann doch nicht
    so Problematisch sein.



  • Kannst Du den Fehler in einem Minimal-Projekt reproduzieren? Respektive, welche Variante verwendest Du denn jetzt?



  • Joe_M. schrieb:

    Kannst Du den Fehler in einem Minimal-Projekt reproduzieren? Respektive, welche Variante verwendest Du denn jetzt?

    Habe strcpy StrCopy und StrLCopy versucht ab und zu immer das gleiche Problem.

    Werde das mal in einem Minimal Projekt testen.



  • Folgende Versionen funktionieren einwandfrei:

    char Buffer[30];
    	AnsiString asBuffer = "ABCDE";
    //	strcpy(Buffer, asBuffer.c_str());
    //	strncpy(Buffer, asBuffer.c_str(), asBuffer.Length());
    //	StrLCopy(Buffer, asBuffer.c_str(), asBuffer.Length());
    	StrLCopy(Buffer, asBuffer.c_str(), 29); // 29, weil maximal 30 Zeichen in Buffer passen, da das letzte Zeichen \0 sein muss
    

    Falls Deine Version identisch ist, passiert der Fehler an einer anderen Stelle.



  • Habe ich gerade im Mini Projekt auch festgestellt, muss ich mal Forschen wo das
    Problem liegt.

    Danke.


Anmelden zum Antworten