RandyK Geschrieben 21. Januar 2011 Geschrieben 21. Januar 2011 Hi leute, hab folgendes Problem: Schreiben Sie ein Programm, dem Sie zwei oder mehr Zeichenketten als Kommandozeilenparameter übergeben können, und das diese dann aneinandergehängt ausgibt. Führen Sie eine Kontrolle der Anzahl der übergebenen Kommandozeilenparameter durch. Das Aneinanderhängen von zwei oder mehr Zeichenketten realisieren Sie durch eine Funktion mit dem Prototypen char * cat(char * string[], int anzahl), der Sie bei Aufruf ein Feld string von Zeichenketten der Länge anzahl übergeben. Diese Funktion soll einen Zeiger auf die Ergebniszeichenkette, welche sich aus allen Komponenten von string zusammensetzt, zurückgeben. Dazu müssen Sie im Funktionsrumpf dynamisch ausreichend Speicherplatz reservieren. Vergessen Sie die Speicherfreigabe am Ende des Programms nicht. Sie dürfen die Bibliotheksfunktionen strlen und strcat verwenden. Und ich check nix davon.... ich kann mit den verfluchten Pointern einfach ums verrecken nicht umgehen und hab nich die geringste ahnung, wie ich das anstellen soll... hier meine kläglichen bisherigen versuche: #include <stdio.h> #include <stdlib.h> char * cat(char * string[], int anzahl){ char *ergebnis; int i; ergebnis = malloc(sizeof(string)); for(i=1;i<anzahl;i++){ strcat(string[0],string[i]); } *ergebnis = string; return ergebnis; } main(int argc, char* argv[]) { int anzahl = argc-1; printf("%s", *cat(argv,anzahl)); } wobei sich das ding nichmal kompilieren lässt... weiß echt überhaupt nich weiter... :confused: ich hoff mir kann iwer helfen. Grüße Randy Zitieren
Klotzkopp Geschrieben 21. Januar 2011 Geschrieben 21. Januar 2011 Dein Ansatz ist gar nicht verkehrt, nur die Umsetzung ist in die Hose gegangen. Es fängt damit an, dass du sizeof benutzt. sizeof wird nicht dein String-Array durchsuchen und, ohne dessen Länge zu kennen, die Längen der darin enthaltenen Strings ermitteln und zusammenzählen. sizeof liefert dir die Größe eines Typen. sizeof(string) ist also dasselbe wie sizeof(char**), in deinem Fall vermutlich 4. Du musst dich also selbst darum kümmern, die Längen deiner Strings zusammenzuzählen. Und benutz dazu bitte strlen, nicht sizeof. Außerdem solltest du deinen Ergebnis-String in dem dafür bereitgestellen Speicher zusammensetzen. Du kannst ja gar nicht wissen, ob in string[0] genug Platz ist. Und schließlich solltets du in main den Rückgabewert von cat in einer Variablen speichern, sonst hast du keine Möglichkeit mehr, den Speicher jemals wieder freizugeben.weiß echt überhaupt nich weiter... :confused: ich hoff mir kann iwer helfen.Ist das jetzt eigentlich cool, "irgend" nicht mehr auszuschreiben? Ich sehe das in letzter Zeit häufiger (und finde es furchtbar). Zitieren
RandyK Geschrieben 23. Januar 2011 Autor Geschrieben 23. Januar 2011 Hallo, Klotzkopp Danke für die Antwort! Also das mit sizeof und strlen war mir neu... gut zu wissen! nur komme ich mit der anwendung irgendwie nicht ganz klar. ich hab den code jetzt mal umgeschrieben, er funktioniert aber leider immernoch nicht. pointer machen mich langsam verrückt :eek kannst du mir vllt genauer erklären, was ich falsch mache? #include <stdio.h> #include <stdlib.h> char *cat(char *string[], int anzahl){ int i, length = 0; char*res; for(i=0;i<anzahl;i++) length = length + strlen(**string++); res = malloc(length*sizeof(char)); if(res == NULL) return NULL; for(i=2;i<length;i++) *res = strcat(**string,**string++); res = string; return res; } main(int argc, char *argv[]) { int anzahl = argc-1; printf("%s",*cat(argv,anzahl)); getchar(); } irgendwo muss ich ja nen grundlegenden denkfehler haben... ich komm auf zeiger irgendwie noch nicht ganz klar. Danke im Vorraus! Grüße Randy Zitieren
Klotzkopp Geschrieben 23. Januar 2011 Geschrieben 23. Januar 2011 kannst du mir vllt genauer erklären, was ich falsch mache?Es ist keine gute Idee, wenn du schon in der Längen-Zählschleife mit string++ durch dein Stringarray läufst, denn danach zeigt string nicht mehr auf den Anfang des Arrays, sondern dahinter. Benutz besser den Arrayzugriffsoperator [] mit i als Index. Doppelte Dereferenzierungen brauchst du hier auch nirgends, weil du niemals auf einzelne Zeichen zugreifen musst. Außerdem musst du noch beachten, dass du im Ergebnisarray ein zusätzliches Byte für die Nullterminierung brauchst. Und ich hatte es schon im letzten Beitrag gesagt: Setz deinen String in res zusammen, nicht in string[0]. Erstens weißt du nicht, ob string[0] groß genug ist, zweitens ist der für res angeforderte Speicher dadurch ungenutzt und hinterher durch die Zuweisung res = string sogar verloren, weil du ihn nicht mehr freigeben kannst. Und schließlich solltets du in main den Rückgabewert von cat in einer Variablen speichern, sonst hast du keine Möglichkeit mehr, den Speicher jemals wieder freizugeben.. Zitieren
lilith2k3 Geschrieben 23. Januar 2011 Geschrieben 23. Januar 2011 (bearbeitet) #include <stdio.h> #include <stdlib.h> #include <string.h> char *cat(char *string[], int anzahl); const char stringEnde='\0'; int main(int argc, char **argv){ char *ergebnis=cat(argv, argc); printf("%s", ergebnis); free(ergebnis); return (EXIT_SUCCESS); } char *cat(char *string[], int anzahl){ int i=0; int j=0; int erstesArgument=1; int gesamtLaenge=0; char *resultstring=NULL; char *resultpointer=NULL; for (i=erstesArgument; i< anzahl; i++){ gesamtLaenge+=strlen(string[i]); } resultstring=malloc(gesamtLaenge+1); resultpointer=resultstring; for (i=erstesArgument; i< anzahl; i++){ for (j=0; string[i][j] !=stringEnde; j++){ *resultpointer++=string[i][j]; } } *resultpointer=stringEnde; return resultstring; }[/php] Bearbeitet 23. Januar 2011 von lilith2k3 Zitieren
RandyK Geschrieben 24. Januar 2011 Autor Geschrieben 24. Januar 2011 woa vielen vielen Dank für die Lösung! Die Abgabe ist seit heute vorbei und irgendwie war bis vor kurzem der Server down :upps aber jetzt hab ich wenigstens mal kapiert, wie das funktioniert... mein Ansatz war tatsächlich nicht so schlecht wie ich dachte. War wirklich wichtig, weil ich schreib nächste woche Klausur also danke nochmal Gruß Randy Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.