Allgem. Frage zu strcat und strcpy (malloc + free bzw. Speicherfreigabe)



  • Hallo liebes Forum,

    Ich sitze gerade an einer C-Funktion, die verschiedene Strings (soll heissen Zeichenreihen) zusammenfuegen soll. Es geht um Listenelemente, die bspw. mit "x1", "x2", "x3", .. usw. benannt sind und in der Form "<x1>", "<x2>", "<x3>", .. usw. angezeigt werden sollen. Dazu muessen die Zeichen(-reihen) '<', [Elementname] und '>' jeweils zusammengefuegt werden. Anschliessend moechte ich diese Zeichenreihen nochmals miteinander verknuepfen (Gesamtliste).

    Frage: Wie macht man sowas am elegantesten? 😕

    Ist es sinnvoll, eine Verschachtelung der strcat-Funktion zu benutzen? Also beispielsweise:

    char *s = "", *ename = "x1";
      str(s, str("<", str(ename, ">")));
    

    Problem: Wie sieht es dabei mit der Freigabe des Speichers aus, wenn man den String (im Beispiel Pointer s) nicht mehr braucht? Ein anschliessendes free(s) duerfte i.a. zum Absturz fuehren, da die Zeichenreihe nicht mittels malloc() alloziiert wurde (in meinem Programm war es zumindest so); ausserdem ist ename nun stets die Zeichenreihe "x1>", was irgendwie doof ist ...

    Oder macht man es so (Goessenangaben und Indizes hier der Einfachheit halber konstant):

    char *s = (char *)malloc(5), *ename = "x1";
      s[0] = '<';
      strcpy(s+1, ename);
      s[3] = '<';
      s[4] = '\0';
    

    Letztere Variante liefert einen String, der mittels free() dealloziert werden kann, aber es sieht nicht gerade nett aus.

    Problem: Man muss bei jeder Verknuepfung einen neuen Kopierpuffer anlegen. Bei mehrfachem Zusammenfuegen diverser Zeichenreihen wird das recht unuebersichtlich (insbesondere bei variablen Laengen der Teilzeichenreihen), so dass man um ein Makro oder eine Hilfsfunktion wohl nicht herumkommt. Letzteres waere nicht so wild, aber es muessen fuer strcpy stets Kopien der Strings im Speicher sein, was bei vielen Zeichenreihen den Speicherverbrauch mehr oder weniger unnoetig aufblaeht (bin mir nicht sicher, ob das bei strcat auch so ist).

    Kennt jemand einen guten Mittelweg fuer das Problem?

    Im voraus bereits vielen Dank fuer einen hilfreichen Tipp!!

    Flachkoepper 🙂



  • Hallo Flachkoepper,

    Kennst du die Funktion sprintf()?
    Lies dir mal die man-pages dazu durch, ich glaube, die könnte dir
    hier weiterhelfen.

    Bei dieser Funktion musst du aufpassen, dass du einen genügend großen
    Buffer die alloziert hast. Aber das sollte ja kein Problem sein.

    Der Code hierzu sieht dann in etwa so aus:

    char *s = (char*) malloc( 100* sizeof(*s) ); // die 100 muss bei dir ersetzt werden
       sprintf(s, "<%s>", ename);
    
       [...]
    
       free(s);
    

    Ich hoffe, ich konnte dir hiermit helfen.

    Mfg mcr



  • ... wobei du, um dich vor einem Speicher-Zugriffsfehler zu schützen besser die Funktion

    int snprintf(char *str, size_t size, const char *format, ...);
    

    benutzen solltest. Hier kannst die Länge deines allozierten Strings angeben.
    Dadurch wird es nie vorkommen dass durch eine zu lange Benutzereingabe ungewollt Speicher überschrieben wird.

    MFG TheRightWay
    (und sorry wenn das jetzt ein bisschen nach Klugschei**en aussah ;))


Anmelden zum Antworten