Zeichenketten verknüpfen



  • Hallo.

    Wir sollen eine Funktion zur Stringaddition (also zum Verknüpfen zweier Zeichenketten zu einer) schreiben, jedoch ohne Verwendung von Zeichenkettenfunktionen der Standardbibliothek.

    Mein Gedanke wäre es, in einer Schleife beide Char-Felder bis zum Ende durchzulaufen und so Zeichen für Zeichen in ein neues Feld zu schreiben. Und zwar wie folgt:

    char stringaddition( char kette1[], char kette2[])
    {
    
         char gesamtstring[100];
    
         int k=0, n=0;
    
         while (&kette1[k] != "\0" )
         {
               gesamtstring[n] = kette1[k];
    
               n++; k++;
    
         } 
    
         k = 0;
    
         while (&kette2[n] != "\0" )
         {
               gesamtstring[n] = kette2[k];
    
               n++; k++;
         } 
    
         return *gesamtstring;
    }
    

    Funktioniert aber schon deswegen nicht, weil die Bedingung in der while-Anweisung ignoriert wird (ich dächte aber, dass "\0" das Ende einer char-Zeichenkette markiert, oder etwa nicht?). Somit läuft er über die Grenzen des Arrays hinaus, was dann zum Programmabsturz führt.

    Kann mir mal jemand bei der Funktion helfen? Danke.

    Freundliche Grüße,
    Infostudent.



  • Erstmal solltest du nicht die Adresse des k-ten Stringelements mit '\0' vergleichen, sondern seinen Inhalt (auf deutsch: das & in der Schleifenbedingung ist überflüssig).

    Zweitens gibst du nur das erste Element des zusammengesetzten Strings zurück - du mußt einen char* zurückliefern (und dir die Erklärungen hier durchlesen, wie du dessen Gültigkeit über das Funktionsende erhalten kannst.

    Drittens hast du vergessen, an den zusammengebauten String einen Null-Terminator anzuhängen

    Und viertens hast du ein Problem, wenn die übergebenen Strings zusammen länger sind als 99 Zeichen.

    PS: Was spricht eigentlich gegen strcat()? Darfst oder willst du es nicht verwenden?



  • Hallo CStoll, danke für die Antwort.

    Wir dürfen keine Zeichenkettenfunktionen verwenden, weil wir uns im Arbeiten mit Zeigern und Chars üben sollen.

    Das mit den Null-Terminator hab ich aus dem Kontext des Links noch nicht ganz verstanden. Das Problem das ich momentan habe ist jedoch ein anderes, nämlich ein Fehler in der return-Zeile.

    char* stringaddition( char kette1[], char kette2[])
    {
    
         char gesamtstring[100];
    
         int k=0, n=0;
    
         while (kette1[k] != '\0' )
         {
               gesamtstring[n] = kette1[k];
    
               n++; k++;
    
         } 
    
         k = 0;
    
         while (kette2[n] != '\0' )
         {
               gesamtstring[n] = kette2[k];
    
               n++; k++;
    
         } 
    
         gesamtstring[n] = '\0';
    
         return gesamtstring* ;
    }
    

    Fehlermeldung: expected primary-expression before ; tooken (in der return-Zeile).

    Lass ich den Zeiger-Stern weg, dann kommt keine Fehlermeldung, aber dann wird halt nur die Adresse der Zeichenkette zurückgegeben.

    PS: Die Länge von 100 hab ich erst mal nur zum Testen verwendet. Wenn es dann erst einmal funktioniert, werde ich geeignete Bedingungen wählen, um einen Überlauf des Gesamtstrings zu verhindern.

    Grüße,
    Infostudent,



  • Infostudent schrieb:

    Das mit den Null-Terminator hab ich aus dem Kontext des Links noch nicht ganz verstanden. Das Problem das ich momentan habe ist jedoch ein anderes, nämlich ein Fehler in der return-Zeile.

    Welcher Link? Meiner? Der hat auch nichts mit dem Null-Terminator zu tun.

    Das ist zwar nicht unbedingt vorgeschrieben, aber Strings im C-Stil werden mit einem '\0' abgeschlossen - und wenn du mit dem zurückgegebenen String noch weiterarbeiten willst, mußt (oder besser: solltest) du dich an diese Konvention halten.

    Fehlermeldung: expected primary-expression before ; tooken (in der return-Zeile).

    Ja, wenn du einen Zeiger dereferenzieren willst (aber das willst du hier nicht einmal ;)), gehört der Stern vor den Zeiger - beim 'gesamtstring*' wird er als Multiplikationszeichen gedeutet und da fehlt dem Compiler der zweite Faktor.

    Lass ich den Zeiger-Stern weg, dann kommt keine Fehlermeldung, aber dann wird halt nur die Adresse der Zeichenkette zurückgegeben.

    Und genau die Adresse benötigst du (ein "C-String" ist nur ein Zeiger - also die Adresse des Blocks, an dem die Zeichen untergebracht sind). Allerdings hast du das Problem, daß dein Array beim nächsten Aufruf einer anderen Funktion von dieser neu genutzt wird - und wie du DAMIT umgehen kannst, kannst du dir in dem oben verlinkten Beitrag ansehen.



  • Infostudent schrieb:

    Fehlermeldung: expected primary-expression before ; tooken (in der return-Zeile).

    das sternchen muss da wech 🙂
    ...und gesamtstring solltest du besser 'static' machen.

    btw: wie wär's damit?

    void another_strcat (char *s1, char *s2, char *out)
    {
       while (*s1)
          *out++ = *s1++;
       while (*s2)
          *out++ = *s2++;
       *out = 0; 
    }
    

    ist zwar verbesserungswürdig, aber wenigstens ist kein array in der funktion drin...


Anmelden zum Antworten