Einen String mit return zurückgeben?



  • Ist das irwie möglich?

    Schema:

    char fkt(void)
    {
    char String[]="Hallo";
    return(String);
    }

    Gruß
    Agahan

    Edit: Kleiner Fehler!



  • Du könntest den String dynamisch auf dem Heap erzeugen (malloc). Dann finde ich es meistens aber besser, wenn das die aufrufende Funktion macht und einen Zeiger an deine Funktion übergibt, der dann gefüllt wird. So wird das free auf derselben Ebene aufgerufen, auf der auch malloc ausgeführt wird.



  • Hallo, _matze!

    Hmmm... kannst du mir bitte ein Beispiel dazu geben?

    Gruß
    Agi



  • aXYZn schrieb:

    Ist das irwie möglich?

    Schema:

    char fkt(void)
    {
    char String[]="Hallo";
    return(String);
    }

    so etwa:

    char *fkt(void)
    {
       return "hallo";
    }
    

    ^^aber das gibt 'nen string zurück, den du nicht ändern darfst.
    oder das:

    char *fkt(void)
    {
       static char str[] = "hallo";
       return str;
    }
    

    ^^gibt aber immer 'nen zeiger auf den gleichen string zurück
    🙂



  • aXYZn schrieb:

    Hallo, _matze!

    Hmmm... kannst du mir bitte ein Beispiel dazu geben?

    Gruß
    Agi

    Na so etwa:

    char *stringback(void)
    {
    	char mystring[] = "Hello world";
    	char *returnstring = NULL;
    
    //	returnstring = malloc(sizeof(mystring)); Auaaa!
    	returnstring = malloc(strlen(mystring) + 1);
    	if (returnstring)
    		strcpy(returnstring, mystring);
    	return returnstring;
    }
    

    Liefert bei Fehlschlag NULL, bei Erfolg den String, der ja eigentlich nur ein Zeiger ist. Bitte nicht vergessen, das Ding wieder mit free() freizugeben ... 😉

    EDIT: Passiert mir immer wieder *grummel*



  • Danke +fricky !!! 😃 Es funct !!!



  • aXYZn schrieb:

    Danke +fricky !!! Es funct !!!

    aber beachte die einschränkungen.

    pointercrash() schrieb:

    Liefert bei Fehlschlag NULL, bei Erfolg den String, der ja eigentlich nur ein Zeiger ist. Bitte nicht vergessen, das Ding wieder mit free() freizugeben ...

    oder 'strdup()' nehmen. macht das gleiche.
    🙂



  • +fricky schrieb:

    ... oder 'strdup()' nehmen. macht das gleiche.

    Klingt praktisch, spart Verrenkungen, kannte ich noch nicht ... wenn's nur ginge. Angeblich kommt's mit der <string.h>, bei Pelles C anscheinend nicht. Da wird gemault, daß der Prototyp unbekannt ist und der default int verträgt sich mit char* natürlich nicht.
    Bin ich da womöglich auf einen echten Bug gestoßen?



  • ^^es ist jedenfalls keine ansi-funktion. kann schon sein, dass viele da etwas anderes bauen.
    🙂



  • +fricky schrieb:

    ^^es ist jedenfalls keine ansi-funktion. kann schon sein, dass viele da etwas anderes bauen. 🙂

    In dem Fall nicht, die Doku in der IDE entspricht genau dem, was man.cx entnehmen kann, sogar der Ausfüllwizard kennt das Ding.
    Das VStudio stößt sich noch nichtmal, wenn man den include vom <string.h> in dem Modul vergißt, beim Pelle bleibt es bei

    T:\test.c(48): warning #2027: Missing prototype for 'strdup'.
    T:\test.c(48): error #2168: Operands of = have incompatible types 'char *' and 'int'.
    

    Wird wohl wirklich vergessen worden sein ... 😞



  • +fricky schrieb:

    ^^es ist jedenfalls keine ansi-funktion. kann schon sein, dass viele da etwas anderes bauen.
    🙂

    Also, öööhmm, beim Pelle heißt das jetzt _strdup, weil ja nicht- ANSI und damit pfui!
    Es wurde nur der wizard zum Funktionenausfüllen vergessen, in der Hilfe übersieht man das Unterstricherl gerne.


Anmelden zum Antworten