Strings selber verbinden



  • Hi Leute, ich muss in C 2 String miteinander verbinden, dazu muss ich aber eine selbst geschriebene Funktion verwenden, die zwei Strings als Eingabeparameter hat und einen dritten String erzeugt, der die beiden Strings durch ein &-Zeichen verbunden enthält.

    Danke



  • char* strcatn(char* d, const char* s, size_t n)
    {
    	if(!*d)
    	{
    		if(!*s) return d;
    		*d = *s++;
    	}
    	if(--n>1)
    		return strcatn(++d,s,n);
    	*++d='\0';
    	return d;
    }
    

    Traum... 😃



  • cocatenat0r schrieb:

    char* strcatn(char* d, const char* s, size_t n)
    {
    	if(!*d)
    	{
    		if(!*s) return d;
    		*d = *s++;
    	}
    	if(--n>1)
    		return strcatn(++d,s,n);
    	*++d='\0';
    	return d;
    }
    

    Traum... 😃

    Wow das ist zu fortgeschritten für mich 😃 aber das ist nicht so wie es in der Aufgabestellung verlangt ist oder?



  • 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,
    ein char* ist eine Adresse auf ein char .
    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 liefert strlen ?
    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.


Anmelden zum Antworten