C: funktion, welche strings zusammenfügt

marvellous

Mitglied
hallo:) also hab hier eine aufgabe, in welcher ich 2 strings zusammensetzen soll

Die Funktion verbinde(char *st1, char *st2) gibt den String zurück, der entsteht,
wenn der durch st2 referenzierte String an den durch st1 referenzierten String angehängt
wird. Z.B. gibt verbinde ("alpha", "beta") den String "alphabeta" zurück.
Schreiben Sie diese Funktion. Es stehen Ihnen keine Funktionen aus <string.h> zur Verfügung!
Sie müssen ggf. weitere Hilfsfunktionen definieren.

hab jetzt mal eine funktion geschrieben:


Code:
verbinde(char *str1, char *str2)
{
char alpha[10]="alpha";
char beta[10]="beta";
str1=&alpha;
str2=&beta;
char s="*str1 + *str2";
return s;
}

ist das so richtig? :S wäre dankbar für eure hilfe:)
 
Hmm...

1) Returntyp fehlt. Compilerfehler.

2) Für was sind die ersten vier Codezeilen gut?
Du legst zwei neue Strings an, weist den übergebenen Pointern die Adressen der Adressen der char-Array zu und verlierst somit die übergebenen Informationen.
Außerdem sollte char* in char** auch gecastet sein. Compilerfehler
Im restlichen Code brauchst du diese Variablen nie wieder. Die vier Zeilen könntest du also eigentlich auch weglassen.

3) Dann machst du mit der Variable s ein einzelnes char, dem du einen ganzen String zuweisen willst. Compilerfehler.

4) Wenn das s ein String wäre, würdest du ihm "*str1 + *str2" zuweisen und das zurückgeben.
Da es aber eine lokale Variable ist, wird die wieder gelöscht.
Im mian (etc) greifst du dann auf gut Glück auf den Speicher zu.
Vielleicht sind die Buchstaben noch drin, vielleicht aber auch schon von anderen Sachen überschrieben


Die Funktion strcat aus string.h, die du nachbilden willst, macht nur folgendes:
1) Ermitteln, wie lang der erste String ist.
2) Nach dem letzten Buchstaben vom ersten String buchstabenweise den zweiten String reinschreiben.
Bis jeder Buchstabe des zweiten Strings kopiert ist.
3) Wenn du willst, kannst du noch die Adresse des ersten Strings (der jetzt den Inhalt beider hat) zurückgeben.

C++:
char *verbinde(char *a,char *b)
{
    while((*a)!='\0')a++;
    while((*b)!='\0')*(a++)=*(b++);
    return a;
}

Gruß
 
Zuletzt bearbeitet:
Kleiner Fehler, das return ist eigentlich etwas deplaziert.
Das könnte man machen, wenn man a am Anfang der Funktion in einer eigenen Variable speichert, die unverändert bleibt.
Da ich a aber weiterzähle, würde ich die Adresse vom Stringende zurückgeben, statt vom Anfang. Vergiss das return einfach.
C++:
void verbinde(char *a,char *b)
{
    while((*a)!='\0')a++;
    while((*b)!='\0')*(a++)=*(b++);
}

Gruß
 
C++:
void verbinde(char *a,char *b)
{
    while((*a)!='\0')a++;
    while((*b)!='\0')*(a++)=*(b++);
}
Die Klammerung ist komplett überflüssig und falsch ist die Lösung auch (wegen fehlendem '\0' im resultierenden a):
C:
void verbinde(char *a,const char *b)
{
    while( *a ) a++; /* an Position nach Ende von String a gehen */
    while( *b ) *a++=*b++;
    *a=0;
}
Weiterhin musst garantiert sein, dass der Speicherbereich von a groß genug dimensioniert ist um alle Zeichen in b aufzunehmen, also würde z.B.

C:
char a[4]="bla",*b="4711";
verbinde(a,b);
scheitern,
C:
char a[8]="bla",*b="4711";
verbinde(a,b);
hingegen nicht.
 
@'\0':Oje, recht hast du. Hoffentlich gibts deswegen keine schlechtere Note, marvellous :(
@Klammern: Sie schaden aber auch nicht...
@Speicherüberlauf: Stimmt aber wie willst du das verhindern? Ohne einen zusätzlichen Längenparameter mitzugeben wird das nichts.
Der Aufrufer muss eben aufpassen, dass er nichts Unpassendes übergibt.

Gruß
 
Zurück