c-string als parameter übergeben und bearbeiten



  • Hallo,

    ich habe folgenden code :

    void foo (char *& str)
    {
       std::string str2(str);
       //mit str2 arbeite ich jetzt weiter...
       //...
       //jetzt soll str2 nach str kopiert werden
    
       //1:
       memcpy(str, str2.c_str(), str2.length()+1); //access violation
    
       //2:
       strcpy_s(str, str2.length()+1, str2.c_str()); //access violation
    
       //3:
       for(unsigned int i = 0; i < str2.length()+1; ++i) 
       {
          str[i] = str2.c_str()[i]; //access violation
       }
    }
    

    //so in der art wird die funktion aufgerufen

    int main()
    {
       char * test = "test";
       foo(test);
       cout << "test : " << test << endl;
    
       return 0;
    ]
    

    Ich verstehe einfach nicht warum das nicht geht. Ich übergebe den c string doch als referenz!

    Vielen Dank im Voraus.



  • Aktiviere mal Warnungen deines Compilers.



  • So weit ich weiß sind String-Literale nur lesbar, aber du willst in diesen Speicherbereich schreiben.

    Wie hast du solchen Code durch den Compiler geprügelt bekommen?


  • Mod

    Logn schrieb:

    Wie hast du solchen Code durch den Compiler geprügelt bekommen?

    Stringliterale sind in C nicht const-qualifiziert*. Aber es ist undefiniertes Verhalten (in der Praxis normalerweise ein Absturz), wenn man trotzdem versucht sie zu ändern. Fieses Relikt aus alten Zeiten 🙂

    *: Und in C++, was der Threadersteller anscheinend (unabsichtlich?) benutzt, ist die Zuweisung in Zeile 3 der main ebenfalls erlaubt (aber deprecated) aus Kompatibilitätsgründen zu C.
    @Threadersteller: Dir ist schon klar, dass du da ein paar C++-Features nutzt? Dass man aber andererseits in "richtigem" C++ nicht so wie in C mit Zeichenketten umgeht? Benutz einen C-Compiler für deinen C-Code.



  • Du kannst test als Array definieren.

    char test[] = "test";
    

    ^zumindest in C. Wie das Verhalten dann mit dem C++ foo ist, weiß ich nicht.^

    Noch etwas anderes:

    Was meinst du, wieviel Platz du in str (in foo)hast?



  • @Nathan
    Natürlich habe ich die Warnung aktiviert, aber es gab keine.

    @Logn
    Der Code kompiliert reibungslos in VS13 Express

    @SeppJ Ich habe meine Frage ausversehen in das C Forum gepostet 🙄 , wäre nett wenn es jemand verschieben könnte nach C++. Das Problem ist das ich an einem größeren Code arbeite welcher auch überwiegend aus C-strings besteht.

    @DirkB
    Der string wird durch die Funktion entweder kleiner oder bleibt gleich (von der Länge her).

    Habe das Problem jetzt gelöst indem ich ein bisschen mit C++ std::strings gearbeitet habe und der member funktion c_str().

    Danke für die Hilfe!



  • Ceno schrieb:

    @Nathan
    Natürlich habe ich die Warnung aktiviert, aber es gab keine.

    Welchen Compiler verwendest du?
    GCC schmeißt ohne irgendwelchen speziellen Warnungsoptionen:

    warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
         char * test = "test";
    

    Edit: Ah, wegen strcpy_s vermutlich MSVC. Der gibt da glaube ich wirklich keine Warnung.



  • Nathan schrieb:

    Ceno schrieb:

    @Nathan
    Natürlich habe ich die Warnung aktiviert, aber es gab keine.

    Welchen Compiler verwendest du?
    GCC schmeißt ohne irgendwelchen speziellen Warnungsoptionen:

    warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
         char * test = "test";
    

    Hatte ich auch schon bei meinem vorigen Kommentar erwähnt : Visual Studio 2013 Express.

    Ja stimmt wenn man nur strcpy benutzt bekommt man eine warnung, mit _s aber nicht!



  • Ceno schrieb:

    Ja stimmt wenn man nur strcpy benutzt bekommt man eine warnung, mit _s aber nicht!

    Die _s Versionen gibt es aber nicht auf anderen Implementierungen der Standardbibliothek. Die bessere Variante ist imo die normalen zu verwenden und diese Warnung zu dekativieren, so bleibt der Code portabel.



  • Da du die Sicherheit, die dir strcpy_s bieten soll, hier sowieso umgehst (indem du die Länge der Quelle angibst) bringt es dir auch keinen Vorteil.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum C++ (alle ISO-Standards) verschoben.

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

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten