Problem mit Stringrückgabe



  • Original erstellt von spitzenbleistift:
    warum verwendet der gcc nicht automatisch den c99 standard?

    Warum sollte er. Damit riskiert man höchstens, dass alter Sourcecode der eventuell mtii C99 nicht mehr läuft (kenne den Standard leider nicht genau genug dafür) nicht mehr läuft, denn der Compielr heißt ja nach wie vor gcc. Deswegen hat man lieber einen Schalter dafür geschaffen.



  • Original erstellt von Peter Piksa:
    **You ok dankeschön für die Hilfe, habe es jetzt hinbekommen.
    Ist die Lösung so einigemassen akzeptabel?
    **

    Fast 🙂 Du musst den Speicher in der main-Funktion noch wieder freigeben.



  • wie mach ichn das??



  • Original erstellt von Peter Piksa:
    wie mach ichn das??

    char *foo = strrplc("C:\\Mp3\\song.mp3");
    cout << foo << endl;
    free(foo);
    


  • kann ich "free(outputstring);" in der funktion nach dem return machen?



  • Original erstellt von Peter Piksa:
    kann ich "free(outputstring);" in der funktion nach dem return machen?

    Nein, dann wäre der String ja schonwieder ungültig bevor er verwendet wird. Und genau das soll ja vermieden werden.



  • *grummel* mensch is ja kagge.
    dann könnte ich die funktion ja gar nicht woanders benutzen.
    weil dann müsste ich ja merken dass ich immer wenn ich diese funktion benutze ein free dahinter machen muss 😞
    kann man das nicht auch anders lösen?

    ausserdem:

    wenn ich das im main mache kommt: error C2065: 'outputstring' : nichtdeklarierter Bezeichner 😉

    [ Dieser Beitrag wurde am 22.04.2003 um 23:03 Uhr von Peter Piksa editiert. ]



  • Original erstellt von TriPhoenix:
    Warum sollte er. Damit riskiert man höchstens, dass alter Sourcecode der eventuell mtii C99 nicht mehr läuft (kenne den Standard leider nicht genau genug dafür) nicht mehr läuft, denn der Compielr heißt ja nach wie vor gcc. Deswegen hat man lieber einen Schalter dafür geschaffen.

    ihmo ist C99 voll abwaertskompatibel. das sollte also kein grund sein.



  • Original erstellt von Peter Piksa:
    ***grummel* mensch is ja kagge.
    dann könnte ich die funktion ja gar nicht woanders benutzen.
    weil dann müsste ich ja merken dass ich immer wenn ich diese funktion benutze ein free dahinter machen muss 😞
    kann man das nicht auch anders lösen?
    **

    Wahlweise mit ner globalen Variable oder einer eigenen Zeigerverwaltung die sich drum kümmert 🙂

    **
    wenn ich das im main mache kommt: error C2065: 'outputstring' : nichtdeklarierter Bezeichner 😉
    **

    Klar, du musst es ja auch zwischenspeichern. Also wie ich oben gepostet hatte.



  • Original erstellt von TriPhoenix:
    Wahlweise mit ner globalen Variable oder einer eigenen Zeigerverwaltung die sich drum kümmert 🙂

    *staun* 😮 was istn das? *wissenwill*

    das zwischenspeichern ist doch in der funktion selbst.
    und in der funktion kann ich ja nicht free machen.
    und im main nicht weils da unbekannt ist.

    [ Dieser Beitrag wurde am 22.04.2003 um 23:22 Uhr von Peter Piksa editiert. ]



  • Original erstellt von Peter Piksa:
    ***staun* 😮 was istn das? *wissenwill*
    **

    Naja, man kann sogenannte SmartPointer schreiben, Zeiger die sich selbst freigeben wenn sie nicht mehr gebraucht werden. Oder eine Funktion die jedes malloc notiert und bei nicht mehr gebruachten Werten irgendwie die Dinge wieder freigibt. Ist aber alles ein bisschen Overkill für das was du willst 🙂

    **
    das zwischenspeichern ist doch in der funktion selbst.
    und in der funktion kann ich ja nicht free machen.
    und im main nicht weils da unbekannt ist.
    **

    Nein das zwischenspeichern soll gerade in der main sein. Die Main-Funktion soll so aussehen:

    int main()
    {
        char *rueckgabe = strrplc("C:\\Mp3\\song.mp3");
        cout << rueckgabe << endl;
        free(rueckgabe);
        return (0);
    }
    

    PS: ich habe inzwischen gesehen, dass spitzenbleistift in seiner GCC-frage auch noch ne nette Variante gebaut hat.



  • Jetzt versteh ich aber auch nicht mehr wirklich was... 😞
    Bin grade bei diesem code hier.
    der macht keine fehler beim linken/compilieren aber wenn man das prog ausführt, kratzt er ab....

    #include <iostream.h>
    #include <string.h>
    #include <stdlib.h>
    
    char * strrplc(char * string)
    {
        int i, a;
        int lenght = strlen(string);
        int slashcount = 0;
    
        for(i = 0 ; i<=lenght ; i++)
        {
            if (string[i] == 92)
            slashcount++;
        }
        char *outputstring = (char*)malloc(sizeof(char)*slashcount);
        for (a=0, i=0; i<=lenght ; i++, a++)
        {
            if (string[i] != 92)
                outputstring[a] = string[i];
            else
            {
                outputstring[a] = 92;
                outputstring[a+1] = 92;
                a++;
            }
        }
        cout << "Der Outputstring in der Funktion:\t" << outputstring << endl;
        return(outputstring);
    
    }
    
    int main()
    {
        char *outputstring = strrplc("C:\\Mp3\\song.mp3");
        cout << outputstring<<endl;
        free(outputstring);
        return (0); 
    }
    


  • buffer overrun



  • Du musst natürlich per malloc soviel Platz alloziieren wie du brauchst, also strlen(string) + 1 (länge + abschließendes 0-Byte)



  • HILFE!!!

    was ist denn hier los??
    Kann keiner C programmieren...?

    globale variablen, caller muss free'en,...
    das ist doch kein C

    [cpp]
    char * strrplc(const char * string**, char* outputstring**)
    {
    int lenght = strlen(string);
    for (int i=0, a=0; i<=lenght ; i++, a++)
    {
    if (string[i] != 92) //92? was ist 92??
    outputstring[a] = string[i];
    else
    {
    outputstring[a] = 92;
    outputstring[a+1] = 92;
    a++;
    }
    }
    cout << "Der Outputstring in der Funktion:\t" << outputstring << endl;
    return(outputstring);
    }[/cpp]

    der caller muss den speicher besorgen!

    92? was ist 92? absolut unleserlich.
    und i<=length
    das ist ja wohl n scherz, oder?
    da macht man < und NUL't den string nachher explizit

    ausserdem: ich würde ordentlich C++ programmieren, anstatt so einen mischmasch... schaut ja gräßlich aus



  • Original erstellt von Shade Of Mine:
    **
    92? was ist 92? absolut unleserlich.
    **

    ja, ich fand das programm auch ziemlich schlimm. (j waere imho auch besser als a)

    aber anstatt 92 kann man ja nicht wie ueblich '\' schreiben.
    also '\' oder:
    #define bslash 92

    ausserdem sollten die '{' nicht in ner eigenen zeile, sondern in der des befehls stehen :p



  • Original erstellt von Shade Of Mine:
    **caller muss free'en,...
    das ist doch kein C
    **

    Kann es sein dass du gerade C und C++ verwechselst? In C gibts keine Destruktoren, die magisch die Arbeit tun, also kommst du nicht umhin, das zerstören dynamischer Datenstrukturen dem Aufrufer zu überlassen. Das kann sowas wie delete_linked_list(mylist); sein, oder bei char-Puffern eben free(buffer).

    Wenn der Aufrufer den Speicher besorgen muß, dann muß er auch wissen, wie groß der Puffer sein soll. Das geht aber nicht immer.



  • Original erstellt von Shade Of Mine:
    **HILFE!!!

    was ist denn hier los??
    Kann keiner C programmieren...?

    globale variablen, caller muss free'en,...
    das ist doch kein C
    **

    Ich seh das Problem nicht. Globale Variablen sind antürlich wie gesagt unschön aber viele Runtime-Libraries arbeiten auch problemlos damit, wenn man sie vernünftig behandelt. Und Funktion-alloziiert-caller-freet, so arbeiten auch einige Runtime-Library-Funktionen und OS-Calls. Das Problem seh ich wirklich nicht.



  • Minsch, was meckert ihr denn auf einmal alle so viel rum?
    92 ist einfach nur der ASCII Wert für einen Backslash, das wird ja wohl nicht so schwer sein 😉

    Und Shade of Mine, was bringt mir dass nun wenn ich als zweiten Parameter in meiner Funktion ein "char* outputsring" mache? dadurch ist das problem leider immernoch nicht gelöst....



  • Original erstellt von Peter Piksa:
    Und Shade of Mine, was bringt mir dass nun wenn ich als zweiten Parameter in meiner Funktion ein "char outputsring" mache? dadurch ist das problem leider immernoch nicht gelöst....*

    Das verlagert das Problem. Dann muss sich die main drum kümmern entweder per malloc oder per lokaler Variable Speicherplatz bereitzustellen, in den die Funktion dann den Inhalt reinpacken kann.


Anmelden zum Antworten