Strings selber verbinden
-
Nein, du hast deine Fragestellung ja auch editiert.
-
cocatenat0r schrieb:
Nein, du hast deine Fragestellung ja auch editiert.
achso ja sry
-
hat sich geklärt aber wäre super wenn jemand mir erklärt wie ich c an Main zurückgeben kann mit return c funktioniert s nicht
char verbinde(char a[], char b[]) { int i=0, x=0; char d[]="&"; int size = strlen(a)+strlen(b)+3; char c[size]; while(a[i]) { c[i]=a[i]; i++; } c[i]=' '; i++; c[i]=d[0]; i++; c[i]=' '; i++; while(b[x]) { c[i]=b[x]; i++; x++; } c[i]='\0'; }
-
Maziar schrieb:
wäre super wenn jemand mir erklärt wie ich c an Main zurückgeben kann mit return c funktioniert s nicht
Du hast verbinde als Funktion mit dem Rückgabetyp
char
definiert.
c ist aber vom Typ char*1. Ein
char
kann ein einzelnes Zeichen aufnehmen,
einchar*
ist eine Adresse auf einchar
.
Großer, großer Unterschied.2. c ist bei dir eine lokale Variable.
Die verliert nach dem Ende der Funktion sofort ihre Gültigkeit.
Selbst wenn du den Rückgabetyp änderst, dann sind die Daten, auf die der Rückgabewert zeigt längst ungültig.Es hat schon seinen Grund, warum du an die Standardfunktionen immer noch das Ziel als Parameter übergibst.
Was leider bei den Standardfunktionen fehlt, ist die Größe des Zielbereichs.Und:
Welchen Wert liefertstrlen
?
Warum addierst du bei der Berechnung für size eine 3?
Bedenke dabei auch Zeile 26.
-
wenn die funktion einen dritten string erzeugen soll, wirst du nicht drum herum kommen malloc zu verwenden.
-
DirkB schrieb:
Welchen Wert liefert
strlen
?
Warum addierst du bei der Berechnung für size eine 3?Also strlen lifert den Wert von der Variable die in Main initialisiert wird.
ich habe size mit 3 addiert weil ich die Variablen mit "Leerzeichen & Leerzeichen" verbinden muss.
-
HansKlaus schrieb:
wenn die funktion einen dritten string erzeugen soll, wirst du nicht drum herum kommen malloc zu verwenden.
Und wie macht man das?
-
Maziar schrieb:
Also strlen lifert den Wert von der Variable die in Main initialisiert wird.
Nein.
strlen
liefert die Anzahl Zeichen vom übergebenen C-String.
Das ist nicht die Größe von dem Array und auch nicht die für den String benötigten Bytes.Maziar schrieb:
ich habe size mit 3 addiert weil ich die Variablen mit "Leerzeichen & Leerzeichen" verbinden muss.
DirkB schrieb:
Bedenke dabei auch Zeile 26.
Darauf bist du gar nicgt eingegangen.
Weißt du überhaupt, wofür diese Zeile da ist?
-
DirkB schrieb:
Nein.
strlen
liefert die Anzahl Zeichen vom übergebenen C-String.
Das ist nicht die Größe von dem Array und auch nicht die für den String benötigten Bytes.Ist die Anzahl der Zeichen die Arrayläne?
DirkB schrieb:
Bedenke dabei auch Zeile 26. Darauf bist du gar nicgt eingegangen.
Weißt du überhaupt, wofür diese Zeile da ist?Ich dachte das heißt dass der String jetzt endet.
-
Maziar schrieb:
DirkB schrieb:
Bedenke dabei auch Zeile 26. Darauf bist du gar nicgt eingegangen.
Weißt du überhaupt, wofür diese Zeile da ist?Ich dachte das heißt dass der String jetzt endet.
Ja, bedeutet es.
Belegt die '\0' Speicherplatz?
-
Maziar schrieb:
Und wie macht man das?
Du erstellst dir eine Zeigervariable
char *string;
und rufst dann malloc auf und weist der Zeigervariable den Rückgabewert zu
string = malloc(gewünschte_arraylänge × sizeof(char);
dann kannst du den Wert zurück geben oder sonst was machen.
return string;
Sobald du das Array nicht mehr benötigst, musst du free aufrufen und den Zeiger nullsetzen. Im einfachsten Fall vor dem return 0; in main, also
free(string); string=0;
-
HansKlaus schrieb:
free(string); string=0;
Es sollte
string=NULL;
sein, da es sich um einen Zeiger handelt.
Es liest sich besser und eindeutiger.
-
ja das stimmt natürlich. ist schöner.
wichtig ist jedenfalls, dass dieser zeiger einen ungültigen wert bekommt, damit das programm im problemfall abstürzt.