strcpy_s(char* A, strlen(A), char[] B) erzeugt Fehler



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x, bzw. C++11) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Sorry, hat sich erledigt, der Fehler saß (mal wieder) vor'm PC.

    Es lag also nicht an strcpy_s - nur noch kurz als Anmerkung, die Variante:
    strcpy_s(A, strlen(A) + 1, 😎
    war richtig.

    Danke.



  • Was sagt denn die Hilfe dazu?

    Der zweite Parameter gibt an, wieviel Zeichen (inklusive der '\0') der Zielstring aufnehmen kann. strcpy() kopieret die '\0' mit.
    strlen() liefert aber die Länge ohne die '\0'.

    strlen() ist aber eh die Falsche Methode dabei.

    Wie ist denn der Buffer A definiert?

    Falls dich die Warnung von VS2010 nervt ("unsichere Methode"), kannst du die auch gezielt auschalten.



  • Wieso ist strlen() die falsche Methode?

    Zitat MSDN:
    "errno_t strcpy_s(
    char *strDestination,
    size_t numberOfElements,
    const char *strSource
    );"
    Das bedeutet also das als zweiter Parameter die Anzahl an Zeichen von strDestination verlangt wird. Und wie Du gerade selber gesagt hast liefert mir strlen diese ohne abschließende "\0", weswegen ich dann eben strlen(strDestination) + 1 angebe.
    Soweit ich das sehe ist das korrekt.



  • DiaryOfDreams schrieb:

    Das bedeutet also das als zweiter Parameter die Anzahl an Zeichen von strDestination verlangt wird.

    Nein. Nicht die Anzahl der Zeichen, sondern die Größe des Zielpuffers.

    Der Wert soll angeben, wieviel reinpasst, nicht wieviel gerade drin steht.

    Wenn in deinem Zielpuffer gleich am Anfang ein '\0' steht, gibt dir strlen 0 zurück, und du kopierst gar nichts.



  • Für dein char-Array B müsstes du da 15 angeben.
    (Darum die Frage wie A definiert ist.)



  • A ist als char* definiert. Aber der kopiert ja eh nur bis zum "\0", also elf Zeichen insgesamt und nicht 15 (keine Ahnung warum im Quellcode früher 15 Zeichen initialisiert wurden).



  • DiaryOfDreams schrieb:

    A ist als char* definiert.

    D.h, du weißt in deiner Funktion nicht, wie viel Platz in A ist.
    Also brauchst du doch strcpy_s nicht (das s steht für secure und soll Pufferüberläufe verhindern) .

    Da kannst du weiterhin strcpy() nehmen.
    Oder du übergibst auch an deine Funktion die Größe von A.

    Wenn du char B[15]; hast, kannst du die Größe mit sizeof(B); bekommen. Das liefert dann 15.
    Bei char *A; liefert sizeof(A); allerdings die Größe eines Zeigers (auf 32bit-Maschinen i.A. 4)



  • DiaryOfDreams schrieb:

    ...
    Ich soll ein großes Programm auf der Arbeit von VC++6 auf VC++2010 umbauen und bin gerade dabei die ganzen strcpy-Befehle nach strcpy_s umzubauen...

    Da bist du wirklich zu bedauern, wenn du die Migration eines "großen" Programms auf diesem Level durchführst bzw. auf dieses Level reduzierst.
    strcpy_s ist zwar immerhin C11-Standard, aber für andere solcher Umbauten ist dass bei MSVC eben nicht gewährleistet, zumal die noch nicht mal C99 unterstützen.



  • Das ist ja interessant

    strcpy_s
    

    was Microsoft schon länger (VS 2005 ?) als Erweiterung für C in der MSDN empfiehlt ist nun in C11 aufgenommen.

    Da das Projekt nur innerhalb der MS-Compilerwelt umgesetzt werden soll, ist C99 ja fast komplett aussen vor. Und wie gross ist die Wahrscheinlichkeit der Quelltext auf einem nicht MS-Compiler laufen soll?

    Ich würde das so nach VS2010 umsetzen das der Compiler möglichst wenig oder besser keine Warnungen ausspuckt.

    Es wird ja hier bei anderen Projekten auch empfohlen möglich alle Warnungen zu aktivieren. um möglichst für den jeweiligen Compiler optimalen Quelltext zu erstellen.

    MfG f.-th.



  • Ich habe es jetzt so gelöst dass ich da wo per strcpy in einen Pointer gespeichert werden soll es bei strcpy belasse und in allen anderen Fällen eben strcpy_s verwende.
    Danke an DirkB für den Hinweis dass ich strcpy in diesem Fall nicht ersetzen muss und allen anderen natürlich auch für Ratschläge und Hinweise. 👍


Anmelden zum Antworten