Strings als Rückgabewert??



  • Hallo zusammen,

    ich möchte gerne einen String aus einer Funktion als Rückgabewert bekommen.
    also der Code

    int main(void)
    {
        char uebergabe[50]="Mein Strtok soll gut sein";
        char array[50];
    
        sprintf(array,"%s",mystrtok(uebergabe,' '));
        return 0;
    }
    
    int func(char string[50],char zeichen)
    {
        char *pTokener=NULL,*pStrtok=NULL,string2[50],string3[50];
    
        if(string!=NULL)
        {
            pStrtok=&string[0];
            pTokener=&string[0];
            while(*pTokener!=zeichen)
                pTokener++;
            sprintf(string2,"%s",pTokener);
            *pTokener='\0';
            //printf("%s\n",pStrtok);
        }
        return string2;
    }
    

    Also ich weiß, dass mein Compiler da das wegen der int funktion nicht erlaubt, kann man aber irgendwie einen string zurückgeben????

    lg



  • Indem du einen Pointer auf ein char-Array zurückgibst.

    char * func(char string[50],char zeichen)
    {
        char *pTokener=NULL,*pStrtok=NULL,string2[50],string3[50];
    
        if(string!=NULL)
        {
            pStrtok=&string[0];
            pTokener=&string[0];
            while(*pTokener!=zeichen)
                pTokener++;
            sprintf(string2,"%s",pTokener);
            *pTokener='\0';
            //printf("%s\n",pStrtok);
        }
        return string2;
    }
    

    Falls dir das gar nicht zusagst kannst du ja auch ein char Array als Parameter übergeben und dann statt einer Rückgabe der Wert im Argument speichern.



  • Danke icarus2,

    ich habe jedoch ein weiteres Problem, warum ist pPointer \0 wenn ich mit mystrtok(NULL,' '); debugge, arbeitet die Funktion eh normal, der rückgabewert ist eh OK.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char *mystrtok(char string[50],char zeichen);
    
    int main(void)
    {
        char uebergabe[50]="Mein Strtok soll gut sein";
        char *pPointer=NULL;
        pPointer=mystrtok(uebergabe,' ');
        pPointer=mystrtok(NULL,' ');
        pPointer=mystrtok(NULL,' ');
        pPointer=mystrtok(NULL,' '); //Wert ist "gut"
        printf("%s\n",pPointer); //Wert ist \0
        return 0;
    }
    
    char *mystrtok(char string[50],char zeichen)
    {
        char *pTokener=NULL,*pStrtok=NULL,string2[50],string3[50],string4[50];
    
        if(string!=NULL)
        {
            pStrtok=&string[0];
            pTokener=&string[0];
            while(*pTokener!=zeichen)
                pTokener++;
            sprintf(string2,"%s",pTokener);
            *pTokener='\0';
            return pStrtok;
        }
        else
        {
            pStrtok=&string2[1];
            pTokener=&string2[1];
            while(*pTokener!=zeichen)
                pTokener++;
            sprintf(string3,"%s",pTokener);
            *pTokener='\0';
            sprintf(string4,"%s",pStrtok);
            sprintf(string2,"%s",string3);
            pStrtok=&string4[0];
            return pStrtok;
        }
    }
    


  • Ist natürlich Unsinn, einen Zeiger auf lokale Speicherbereiche zurückzugeben.



  • funktionierern tuts, printen kann ich nicht^^



  • transcend schrieb:

    funktionierern tuts, printen kann ich nicht^^

    Dann funktioniert es also nicht.

    string2 liegt auf dem Stack. Der ist auch noch da wenn du aus der Funktion zurück springst.
    Aber printf belegt den Platz gleich wieder mit eigenen Variablen.
    ➡ Also funktioniert es nicht.

    pStrtok=&string[0];
    

    zeigt, dass du unbedingt nochmal Arrays und Pointer durchlesen musst.

    sprintf(string2,"%s",pTokener);
    

    Dafür gibt es strcpy.

    Das was dir fehlt ist ein

    static char *letzteStelle
    

    in mystrtok



  • danke für die vielen tollen tips, aber es funktioniert trotzdem nicht

    char *mystrtok(char string[50],char zeichen)
    {
        char *pTokener=NULL,*pStrtok=NULL,string2[50],string3[50],string4[50];
        static char *pRueckgabe=NULL;
    
        if(string!=NULL)
        {
            pStrtok=&string[0];
            pTokener=&string[0];
            while(*pTokener!=zeichen)
                pTokener++;
            sprintf(string2,"%s",pTokener);
            *pTokener='\0';
            pRueckgabe=pStrtok;
            return pRueckgabe;
        }
        else
        {
            pStrtok=&string2[1];
            pTokener=&string2[1];
            while(*pTokener!=zeichen)
                pTokener++;
            sprintf(string3,"%s",pTokener);
            *pTokener='\0';
            sprintf(string4,"%s",pStrtok);
            sprintf(string2,"%s",string3);
            pStrtok=&string4[0];
            pRueckgabe=pStrtok;
            return pRueckgabe;
        }
    }
    

    ich verstehe das irgendwie nicht??? 😞



  • noch eine Möglichkeit wäre das char Array in eine Struktur zu verpacken, da diese call by value (wie bis auf arrays alles) übergeben wird.



  • Wo ist jetzt der Unterschied zu oben?

    char *pTokener=NULL,*pStrtok=NULL,string2[50],string3[50],string4[50];
            ...
            pStrtok=&string4[0]; //  pStrtok zeigt jetzt auf string4
    //      pStrtok=string4; ist übrigens das selbe wie oben.
            pRueckgabe=pStrtok;  //  pRueckgabe zeigt jetzt auch auf string4
            return pRueckgabe;   // Du gibst den Verweis auf string4 zurück.
    // ab hier ist string4 aber nicht mehr gültig.
    

    Du kannst nur einen Verweis innerhalb von deinem string[] zurückgeben, denn der ist ja auch außerhalb von mystrtok gültig.



  • ok, vielen dank für eure hilfe
    scönen abend noch 🙂


Anmelden zum Antworten