Strings an Funktion übergeben und Verketten



  • Hallo Kommunity,

    heute hätte ich seit langem wieder eine Frage. Und zwar will ich an eine Funktion zwei Strings "Hallo" und "Welt!" übergen, diese dann Verketten und mit einem Zeiger zurücklievern.

    #include <stdio.h>
    #include <stdlib.h>
    
    char* verknuepfe(char *x, char *y);
    
    int main(void)
    {
    	char *a = "Hallo";
    	char *b = "Welt!";
    	char *erg;
    
    	erg = verknuepfe(a, b);
    
    	printf("%s\n", erg);
    
    	return 0;
    }
    
    char* verknuepfe(char *x, char *y)
    {
    	char *ret;
    	ret = malloc(sizeof(x) + sizeof(y)); // Beim debuggen bügelt es mich hier.
    // Irgendwie funktioniert die Speicherbeschaffung für den neuen String nicht
    
    	ret = (*x) + (*y); // Und wenn ich *ret fix vergebe, klappt diese operation nicht,
    // wobei ich dachte das ich mit dem Indirektionsoperator direkt auf den Wert zugreife
    
    	return ret;
    }
    

    Leider schreibe ich irgendwas in die Pampa und komme nicht weiter. Eventuell könnte mir jm. einen kleinen hint geben.

    Danke und Grüße an euch!


  • Mod

    sizeof(x) gibt dir die Größe von x . x ist ein char* . Das heißt, der Wert hat überhaupt nichts mit der Länge der Zeichenkette zu tun, auf die x zeigt. Funktionen wie strlen geben dir die Größe einer Zeichenkette.

    Mit (*x) + (*y); verhält es sich ähnlich. x und y zeigen auf chars. Du addierst also die Werte zweier chars.

    Da sind noch mehr (teilweise gravierende) Fehler in deinem Programm, aber diese zu korrigieren, wäre müßig. Du hast Zeichenketten in C überhaupt gar nicht verstanden. C hat keinen fundamentalen Typ für Zeichenketten. Du kannst daher nicht einfach Code aus anderen Sprachen nehmen und "string" durch "char*" ersetzen. Guck dir erst einmal in einem Lehrbuch an, wie Zeichenketten in C funktionieren. Danach kann man weitersehen.

    PS: Falls es dir nicht bekannt war: Die Standardbibliothek bietet bereits allerlei Funktionen zur Behandlung von Zeichenketten nach der C-Konvention an. Unter anderem auch eine Funktion namens strcat:
    http://www.cplusplus.com/reference/cstring/strcat/
    http://en.cppreference.com/w/c/string/byte/strcat



  • hm.. ich sitze ja vor einem Buch von Peter Aitken und Bradley L.Jones, welches sich als "Didaktisch bewärtes Format..." bezeichnet.

    Na ja und verstanden, ich versuche es ja gerade zu verstehen was ich gelesen habe, da ich das Kapitel "Zeichen und Strings" mit den Übungen gerade mache, nur gibt es hierzu nicht immer Lösungen. 😞

    Aber deine Bemerkung hat mir gerade tatsächlich gezeicht das ich Zeichenketten mit Strings verwechsel.

    Dennoch Danke für die Anmerkung


  • Mod

    FillColin schrieb:

    hm.. ich sitze ja vor einem Buch von Peter Aitken und Bradley L.Jones, welches sich als "Didaktisch bewärtes Format..." bezeichnet.

    Dann muss das ja so stimmen. Sie würden schließlich in ihrer Werbung ganz ehrlich schreiben, wenn das Buch nicht so toll wäre. Außerdem ist die Rute auch ein didaktisch äußerst bewährtes Instrument.

    Na ja und verstanden, ich versuche es ja gerade zu verstehen was ich gelesen habe, da ich das Kapitel "Zeichen und Strings" mit den Übungen gerade mache, nur gibt es hierzu nicht immer Lösungen. 😞

    Verstehe ich nicht, wie du nach Lektüre dieses Buches auf diese Art der Lösung kommst. In der Leseprobe auf Amazon zu dem Kapitel wurde durchaus korrekt erklärt, wie Zeichenketten in C funktionieren, und die Beispiele haben immer konsequent die Funktionen der Standardbibliothek benutzt (wenn auch teilweise gefährliche, veraltete Funktionen wie gets ).



  • SeppJ schrieb:

    Dann muss das ja so stimmen. Sie würden schließlich in ihrer Werbung ganz ehrlich schreiben, wenn das Buch nicht so toll wäre. Außerdem ist die Rute auch ein didaktisch äußerst bewährtes Instrument.

    Danke für die hilfreiche Bemerkung, dies war sicherlich nicht der einzigste Grund warum ich es habe.

    Wie ich darauf komme?
    "Benutzen sie die Lösung aus Aufgabe 5 und 6" und von #include bis zum Ende der Main war dies die Lösung und ca. 50 der "Verknüpfe funktion" auch. Und das man Neues gelesenes nicht gleich 100% richtig auf anderes Anwenden kann...ach egal.

    Nun gut, ich will mich hier eigendlich nicht rechtfertigen müssen und mir den Spaß den ich bis jetzt noch habe dadurch rauben lassen.

    Belassen wir es dabei ich bekomme es sicherlich alleine hin. Dennoch Danke.


  • Mod

    Und jetzt schmeißt du alles hin, weil ich dir gesagt habe, dass da Fehler in deinem Programm sind (die da auch tatsächlich sind)? Hätte ich sie dir lieber verschweigen sollen? Oder wolltest du einfach, dass jemand komplett deine Aufgaben für dich löst und warst enttäuscht, dass das nicht passierte?



  • FillColin schrieb:

    hm.. ich sitze ja vor einem Buch von Peter Aitken und Bradley L.Jones, welches sich als "Didaktisch bewärtes Format..." bezeichnet.

    C in 14/21 Tagen von Markt und Technik ?

    Am besten ungelesen wegwerfen und was seriöses lesen.

    Allein der Titel ist schon gelogen ...



  • SeppJ schrieb:

    Außerdem ist die Rute auch ein didaktisch äußerst bewährtes Instrument.

    So, jetzt hast du wieder mal einen vielversprechenden newcomer vergrault:
    https://www.c-plusplus.net/forum/332167#2450116

    Schande über dich, Asche auf dein Haupt, usw. :p


  • Mod

    EOP schrieb:

    SeppJ schrieb:

    Außerdem ist die Rute auch ein didaktisch äußerst bewährtes Instrument.

    So, jetzt hast du wieder mal einen vielversprechenden newcomer vergrault:
    https://www.c-plusplus.net/forum/332167#2450116

    Schande über dich, Asche auf dein Haupt, usw. :p

    Dachte ich zunächst auch*, aber guck mal auf das Anmeldedatum und die vorherigen Threads. Irgendwas Merkwürdiges geht da vor. H4xx? Amnesie? Maulwurfmenschen? 😮

    *: Auch wenn das manchmal nicht so aussehen mag, versuche ich doch, die Leute nicht zu vergraulen und immer wenn jemand um Accountlöschung bittet, gucke ich deren jüngste Threads an, in der Furcht, ich könnte der Grund gewesen sein.



  • FillColin schrieb:

    Aber deine Bemerkung hat mir gerade tatsächlich gezeicht das ich Zeichenketten mit Strings verwechsel.

    Zeichenketten und Strings sind in C dasselbe, nämlich eine Folge von char mit Terminierungszeichen '\0'.



  • SeppJ schrieb:

    Dachte ich zunächst auch*, aber guck mal auf das Anmeldedatum und die vorherigen Threads. Irgendwas Merkwürdiges geht da vor. H4xx? Amnesie? Maulwurfmenschen? 😮

    Hab seine threads aus Zeitgründen nur in der Zusammenfassung überflogen.
    Was mir auffällt (ausser drei Jahren Pause) - irgendeine Art von Lernprozess scheint nicht stattgefunden zu haben.


Anmelden zum Antworten