Strings kopieren mit strcat()



  • Hi
    ich war immer der MEinung, strcat würde von sich aus speicherplatz für den neuen String alloziieren, also so vorgehen:
    - wie lang ist 1. string ? ( ohne '\0')
    - wie lang ist zweiter String ? ( mit '\0')
    - reserviers speicherplatz für beide längen
    - kopiere 1.string an neuen Speicherplatz
    - schreibe 2.string in den rest,
    - gib 1. und 2. string frei
    - liefere die neue speicheradresse zurück

    Sonst müsste kingruedi Beispiel verallgemeinert ja so aussehen :

    #include <stdio.h>
    #include <string.h>
    
    int main(void) {
      const char *from="d";
      char to[1 + strlen(from) + 1 ]="c"; // eine "1" für "c", eine für 0x0
      printf(strcat(to,from));
      return 0;
    

    Hanns



  • Und das ist der Grund, wieso so viele Programme fehlerhaft sind. Das was du machst ist schlicht und einfach falsch.



  • hm...

    in meinem eigentlichen Programm hänge ich nun an ein String der Länge 3 (wie in Kingruedis Beispielcode) der nur "d" enthält mit strcat() einen String der Länge 8 an. Dies hat bis jetzt immer funktioniert, dürfte es jedoch nach Virtual Realisticer nicht oder? (mit einem Array der Länge 2 bekomme ich wieder meinen Segmentation fault, daher war ich etwas verwundert warum es mit Länge 3 klappt)

    Korrekt wäre es also in meinem Fall einen String der Länge 10 zu initialisieren:

    ['d',..,..,..,..,..,..,..,..,'\0']

    und mit strcat den zweiten String an diesen anzuhängen?

    gruss, Schmelly



  • Hi,

    also du must dir immer merken:

    Das Zielarray muss gross genug sein, um sich selbst + anzuhaengender String +
    ein '\0' zu speichern.

    Beispiel:

    char  ZielArray[11] = "hallo"; //kann insgesamt 11 zeichen aufnehmen
    char  *Anhaengen[] = " welt";  //anzuhaengender string (5 zeichen)
    
        strcat ( ZielArray, Anhaengen ); //es entsteht "hallo welt" == 10 Zeichen +
                                         //'\0' == 11 Zeichen
    

    Dass es bei dir mal funktioniert, ohne dass du genug Speicher hast, ist reiner
    Zufall und das Programm koennte irgendwann genauso gut abstuerzen.

    in meinem eigentlichen Programm hänge ich nun an ein String der Länge 3 (wie in
    Kingruedis Beispielcode) der nur "d" enthält mit strcat() einen String der Länge
    8 an. ...

    Korrekt wäre es also in meinem Fall einen String der Länge 10 zu initialisieren:

    Du musst das Array nicht initialisieren, du musst es lediglich gross genug
    machen. 10 waere in deinem Fall korrekt.

    mfg
    v R



  • Original erstellt von virtuell Realisticer:
    **
    Dass es bei dir mal funktioniert, ohne dass du genug Speicher hast, ist reiner
    Zufall und das Programm koennte irgendwann genauso gut abstuerzen.
    **

    na ja... mal ist gut, der Programmteil wurde sicher schon 50000 mal aufgerufen 😃

    aber danke euch, hab das nun vernünftig gemacht 🙂

    gruss, Schmelly



  • Original erstellt von dEUs:
    Und das ist der Grund, wieso so viele Programme fehlerhaft sind. Das was du machst ist schlicht und einfach falsch.

    *g* is schon geil, das forum, ich glaub ich werd hier noch meinen spaß ham *rofl* 😃 :p



  • aufschlußreicher nick



  • Original erstellt von Schmelly:
    na ja... mal ist gut, der Programmteil wurde sicher schon 50000 mal aufgerufen 😃

    wenn du ein bisschen mehr Erfahrung sammelst, weisst du, dass du sowas trotzdem vermeiden solltest.

    1. kannst du ziemlich dumme Fehler erhalten, wenn du dein Programm erweiterst (ich hatte mal ein Stacküberlauf in einem Programm, der solange gut ging, bis ich irgend wann mal eine weitere Variable auf dem Stack anlegte und ich habe bestimmt eine Woche nach dem Fehler gesucht 😞 )

    2. wird sich das Verhalten wahrscheinlich ändern, wenn du eine andere Platform (oder Compiler) benutzt



  • also deus, Der bayrische name,
    dann sagt mir mal, was ich falsch mache oh Gott ( deus) ??
    Hanns



  • Du hast keine Ahnung wie strcat funktioniert oder wie man es benutzt und bist zu träge das abzustellen.



  • Original erstellt von Bashar:
    Du hast keine Ahnung wie strcat funktioniert oder wie man es benutzt und bist zu träge das abzustellen.

    1. und 2) scheint zu stimmen; stimmte 3) würde ich mich hier nicht melden !

    Was sagst Du denn bitte hierzu ?

    http://www.cppreference.com/
    strcat
    Syntax:
    #include <string.h>
    char *strcat( char *str1, const char *str2 );

    The strcat() function concatenates str2 onto the end of str1, and returns str1. For example:

    printf( "Enter your name: " );
    scanf( "%s", name );
    title = strcat( name, " the Great" );
    printf( "Hello, %s\n", title );

    Related topics:
    strchr(), strcmp(), and strcpy().

    Nun wollt ich Dir ein weiteres Zitat gegen Dich bringen 😃 😉 , als ich nochmal in nem Symantec-c++-Handbuch nchals, und dieses fand:

    Ten application code is responsible for ensuring that there is enaough space in the string to hold the result.

    Der Mensch irrt, solang er strebt 😃

    Trotzdem, das mit dem bist zu träge war nicht sehr freundlich

    Hanns



  • war auch nicht freundlich gemeint, sondern als Antwort auf dein "Oh dEUs, du hast gefälligst mir mein Manual vorzulesen"


Anmelden zum Antworten