char* per strcat() verketten



  • Gehört vielleicht eher ins ANSI C Forum, aber wie geht das?

    char* H = "Hallo ";
    strcat(H,"Spencer");
    

    DAS geht ja nicht...



  • entweder so:

    const char * H = "Hallo;
    char * buffer = new char [strlen(H) + strlen("Spencer") + 1];
    strcat(buffer, H);
    strcat(buffer, "Spencer");
    

    oder

    char H[1000] = {};
    strcpy(H, "Hallo ");
    strcat(H, "Spencer");
    

    oder

    std::string text = "Hallo ";
    text+="Spencer";
    


  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum ANSI C verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Oder

    char H[1000] = "Hallo ";
    strcat(H,"Spencer");
    


  • Es ist ja schön dem TE Möglickeiten zu zeigen, wie es geht, warum sein Code nicht funktioniert, wurde ihm aber leider nicht mitgeteilt.

    char* H = "Hallo "; // der Compiler reserviert Speicher für 7 chars ("Hallo " und der Nullterminierung)
    

    Für ein Anhängen fehlt weiterer Speicher und es endet in undefiniertem Verhalten.
    Ich denke, du programmierst mit C++, ansonsten hättest du ja nicht ursprünglich in dem Forum gepostet. Wenn das zutrifft, nimm am Besten Möglichkeit 3 von asdfasd.



  • Vicious Falcon schrieb:

    Es ist ja schön dem TE Möglickeiten zu zeigen, wie es geht, warum sein Code nicht funktioniert, wurde ihm aber leider nicht mitgeteilt.

    char* H = "Hallo "; // der Compiler reserviert Speicher für 7 chars ("Hallo " und der Nullterminierung)
    

    Für ein Anhängen fehlt weiterer Speicher und es endet in undefiniertem Verhalten.
    Ich denke, du programmierst mit C++, ansonsten hättest du ja nicht ursprünglich in dem Forum gepostet. Wenn das zutrifft, nimm am Besten Möglichkeit 3 von asdfasd.

    Außerdem sind Literals konstant.

    char const *H = "Hallo";
    

    wäre daher richtig. Das Stringliterals zu char* konvertieren ist leider eine Altlast.



  • Danke euch allen. Diese Konvertierung hat mich eben verwirrt...



  • rüdiger schrieb:

    Außerdem sind Literals konstant.

    Sie können konstant sein. Per char* wird doch nur etwas auf den Stack geschoben, nicht in den const data Bereich des Speichers, der zur Kompilierzeit feststeht.

    char* c = "Es geht auch dann, wenn du nicht daran glaubst!";
    const char* rep1 = "nur ";
    const char* rep2 = "fest ";
    memcpy(c+8,rep1,4);
    memcpy(c+27,rep2,5);
    

    Edit: Dies steht zwar auch zur Kompilierzeit fest, kommt dennoch nicht in den Bereich "const data".



  • Vicious Falcon schrieb:

    rüdiger schrieb:

    Außerdem sind Literals konstant.

    Sie können konstant sein. Per char* wird doch nur etwas auf den Stack geschoben, nicht in den const data Bereich des Speichers, der zur Kompilierzeit feststeht.

    char* c = "Es geht auch dann, wenn du nicht daran glaubst!";
    const char* rep1 = "nur ";
    const char* rep2 = "fest ";
    memcpy(c+8,rep1,4);
    memcpy(c+27,rep2,5);
    

    Edit: Dies steht zwar auch zur Kompilierzeit fest, kommt dennoch nicht in den Bereich "const data".

    Was du machst ist undefined behaviour. Das Literal wird nicht auf den Stack kopiert. Mit char c[] = "blub"; wird es auf den Stack kopiert.



  • Jau, du hast Recht.
    Edit: Ich hatte es gerstern nur mit einem alten VS6 probiert, der übersetzt auch schlechten Code, sodass er fehlerfrei ausgeführt werden kann.
    http://codepad.org/XqV2wXR2


Anmelden zum Antworten