StrCopy



  • Hallo,

    ich habe ein Problem mit StrCopy.

    char *Buffer[30];
    AnsiString asBuffer;

    In asBuffer steht "ABCDE" kopiere ich nun mit StrCopy(Buffer,asBuffer)
    steht ab und zu im Buffer "ABCDE\x14" allerdings nicht immer.



  • Hallo

    Das hier *char Buffer[30]; halte ich schon mal für verdächtig. Für einen einfachen C-String, wie ihn auch StrCopy erwartet, muß entweder ein char-Pointer oder ein statisches char-Array deklariert werden. Du hast aber ein Array von Pointern auf chars.

    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.

    Noch zwei Anmerkungen :
    - Benutzt wie in der BCB-Hilfe beschrieben lieber StrLCopy. Damit kannst du Buffer-Overflow-Attacken verhindern
    - Warum brauchst du überhaupt alte anfällige C-Strings? Du kannst mit AnsiString::c_str() auch direkt einen Pointer an entsprechende (WinAPI-) Funktionen übergeben, solange diese den Inhalt nicht verändern.

    bis bald
    akari



  • akari schrieb:

    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.

    Normalerweise sollte StrCopy schon mit 0 terminieren. Er hat aber hier keinen 0-terminierten String übergeben. das würde dann so aussehen.

    StrCopy(Buffer,asBuffer.c_str());
    

    Das Problem der falschen Deklaration von Buffer besteht natürlich außerdem.



  • 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