Speicher dynmaisch allokieren für Strcat
-
Hallo zusammen, ich habe folgende Aufgabe zu lösen:
**
1. Aufgabe:Im folgenden Programm wird die Funktion "Doppelnamen()" verwendet, um einen Doppelnamen aus zwei Einzelnamen zusammenzusetzen.**
#include <stdio.h> # include <stlib.h> #include <string.h> char * Doppelname(char* pcStr1,char* pcStr2); int main(void) { printf( "%s\n", Doppelname ("Mueller", "Stahl")); /* Sollausgabe: Mueller-Stahl */ return EXIT_SUCCESS; }
**Schreiben Sie die Funktion "Doppelname()", die die beiden Namen, auf die pcStr1 und pcStr2 zeigen, getrennt durch das Zeichen ’-’ zu einem Resultatstring zusammenfügt. Rückgabewert ist ein char-Pointer auf den Doppelnamen (Resultatstring). Der Speicherplatz für den Doppelnamen muss in der passenden Groesse dynamisch allokiert werden.
a) Beschreiben Sie stichpunktartig den eingeschlagenen Lösungsweg!
b) Schreiben Sie die Funktion "Doppelname()" in ANSI-C!**
So, ich versteh jetzt nur nicht wie ich das genau machen soll. Ich hab es mit Strcat probiert, wenn ich Arrays verwende die genügend groß dimensioniert sind ist es auch kein Problem, aber wenn ich versuche den Speicher dynamisch zu allokieren stürzt der Compiler immer wortlos ab. Ich hab die Funktion Doppelname so gemacht:
char * Doppelname(char* pcStr1,char* pcStr2) { pcStr1=malloc(sizeof(pcStr1)+sizeof(pcStr2)+1); //Hier soll pcStr1 so dimensioniert werden, dass sowohl pcStr1, pcStr2 als auch das "-" Zeichen Platz darin hat. return strcat(pcStr1,pcStr2); // Das soll dann einfach den Doppelnamen (der Einfachheit halber noch ohne das "-" Zeichen dazwischen zurückgeben. }
Warum geht das nicht? Wie kann ich den Speicher richtig allokieren, dass das Programm nicht immer abstürzt?
-
Du musst statt sizeof strlen aus der string.h benutzen. sizeof liefert dir nur die Größe des Datentypes in Bytes. Dass heißt für deine Zeiger wäre das, bei 32Bit, 4. strlen liefert dir aber die Länge des Textes. Dann benötigst du Platz für 2 zusätzliche Zeichen. Dein '-' und die abschließende Null. Das Resultat von malloc solltest du dann auf einen weiteren Zeiger speichern, weil dir sonst der Zeiger auf deinen Eingabetext (hier "Mueller") verloren geht. Den Zeiger musst du dann anschließen auf Null testen. Wenn er Null ist, ist etwas in malloc schief gelaufen und du kannst die Funktion einfach mit return 0; verlassen. Den Rückgabewert musst du dann auch in main als Fehler auswerten. pcStr1 kopierst du dann mit strcpy auf den neuen Zeiger und die anderen beiden Strings "-" und pcStr2 hängst du einfach an.
Und nicht in main das free vergessen.
-
Ich würde außerdem noch einen eigenen Zeiger innerhalb der Methode benutzen, der dann zurückgegeben wird. Im Moment überschreibst du den ersten String (bzw. biegst ihn auf eine neue Adresse um), was uU bedeuten kann, dass der alte Inhalt nicht mehr zugänglich ist und im Falle dynamischer Allokation auch nicht freigegeben werden kann.
-
char * Doppelname(char* pcStr1,char* pcStr2) { char *neu = malloc(strlen(pcStr1)+strlen(pcStr2)+2); /*genügend Platz*/ strcpy(neu,pcStr1); strcat(neu,"-"); return strcat(neu,pcStr2); }
-
Genial, jetzt funktioniert es genau so wie es soll!
Vielen Dank Leute
EDIT: Mal noch eine Frage:
Braucht man das "+2" im malloc eigentlich noch? Denn Strlen gibt ja die Länge der Beiden Strings zurück,
also inklusive der jeweiligen \0 ?Hab das +2 probehalber mal weggelassen und es funktioniert immer noch einwandfrei...
-
Ja, das +2 ist notwendig. strlen zählt das \0 nicht mit. Also ist ein +1 für das \0 und das andere +1 für den Bindestrich.
Wenn dein Programm trotzdem klappt, dann ist das einfach Glück.
-
Ok alles klar. Dann lass ich das +2 mal drinnen
-
strlen("") == 0; Belegt aber trotzdem 1 Zeichen.