Zum Inhalt springen

Programm, das Kommandozeilenparameter aneinanderhäng


RandyK

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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).
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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..
Link zu diesem Kommentar
Auf anderen Seiten teilen

#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 von lilith2k3
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...