Char Array in einer Funktion ausgeben.



  • Guten Tag, ich versuche seit längerem ein Char Array in einer Funktion mit return zurückzugeben aber mir gelingt das leider überhaupt nicht.

    #include <iostream>
    #include <string>
    using namespace std;
    
        char *rofl(string &a){
            char C[a.size()];
            for(int i=0;i<a.size();i++){
                C[i] = a[i];
            }
            C[a.size()] = '\0';
            return C;
    
        }
    
    int main()
    {
        string dumm = "dumm";
    
        char *gammeln = rofl(dumm);
    
        cout << *gammeln;
        return 0;
    }
    


  • Das geht nicht. Benutze std::string!



  • manni66 schrieb:

    Das geht nicht. Benutze std::string!

    Das ist ja ein toller Vorschlag nützt mir aber leider nichts 😞
    Ich brauch es als Char für meine Sqlite3 API später.



  • Was geht denn nicht?

    In Zeile 10 übertrittst du die Arraygrenzen (von Zeile 6).

    Und Für die Kompatiblität zu C-APIs gibt es std::string::c_str...



  • Skym0sh0 schrieb:

    Was geht denn nicht?

    In Zeile 10 übertrittst du die Arraygrenzen (von Zeile 6).

    Und Für die Kompatiblität zu C-APIs gibt es std::string::c_str...

    Ubs zu Zeile 10 xD 🙂

    #include <iostream>
    #include <string>
    using namespace std;
    
        char *rofl(string &a){
            char C[a.size()];
            for(int i=0;i<a.size();i++){
                C[i] = a[i];
            }
    
            C[a.size()-1] = '\0';
    
            return C;
    
        }
    
    int main()
    {
        string dumm = "dumm";
    
        char *gammeln = rofl(dumm);
    
        cout << *gammeln;
        return 0;
    }
    

    Mir wird immer nur ein zeichen von cout ausgegeben



  • *gammeln ist ja auch nur ein Zeichen ...
    und gammeln zeigt auf Speicher, der Dir nicht (mehr) gehört.



  • dachdecker schrieb:

    manni66 schrieb:

    Das geht nicht. Benutze std::string!

    Das ist ja ein toller Vorschlag nützt mir aber leider nichts 😞
    Ich brauch es als Char für meine Sqlite3 API später.

    Nein, brauchst du nicht. Die Funktion c_str von std::string reicht völlig.



  • Belli schrieb:

    und gammeln zeigt auf Speicher, der Dir nicht (mehr) gehört.

    Wieso?

    Er fordert den Speicher mit new an, kopiert seine Daten darein und löscht ihn nie.
    Wieso sollte er ihm nicht mehr gehören?

    Klar,
    Regel Nummer 1 besagt "Nutze std::string",
    Regel Nummer 2 sagt "Wenn Regel Nummer 1 mal nicht gelten sollte, dann gilt Regel Nummer 1",
    aber trotzdem ist das erstmal nicht böse. Erst wenn Exceptions und sowas dazu kommt wirds spaßig 😉



  • Welches new? Wo nutzt der TO dies?



  • Welches new? Wo nutzt der TO dies?


  • Mod

    Er fordert den Speicher mit new an, kopiert seine Daten darein und löscht ihn nie.

    Nein: Er gibt die Adresse eines lokalen Objektes zurück. gammeln ist damit ein hängender Zeiger.



  • DirkB schrieb:

    Welches new? Wo nutzt der TO dies?

    Wooha, jetzt wo dus sagst. 😃

    Hab etwas nachlässig drüber gelesen. Und als die Deklaration mit den eckigen Klammern gesehen hab, hat mein Kopf ein new automatisch angenommen ohne weiter zu lesen.

    Dann nehme ich alles zurück (Nimmer trotzdem std::string!) und behaupte das Gegenteil. Sorry Jungs



  • manni66 schrieb:

    dachdecker schrieb:

    manni66 schrieb:

    Das geht nicht. Benutze std::string!

    Das ist ja ein toller Vorschlag nützt mir aber leider nichts 😞
    Ich brauch es als Char für meine Sqlite3 API später.

    Nein, brauchst du nicht. Die Funktion c_str von std::string reicht völlig.

    Der Herr Dachdecker hätte aber gerne, wenn möglich C++ Strings :).
    Ich weiß nämlich vorher nicht wie lang manche eingaben werden bzw. ich hab auch kein bock mich darum zu kümmern 😉

    Aber jetzt mal an die Allgemeinheit.
    Falls jemand von mir herausfindet wie man ein char array zurück gibt wäre ich ihm sehr verbunden.



  • Dachdecker schrieb:

    Der Herr Dachdecker hätte aber gerne, wenn möglich C++ Strings :).
    Ich weiß nämlich vorher nicht wie lang manche eingaben werden bzw. ich hab auch kein bock mich darum zu

    Der Herr Dachdecker ist wohl einmal zuviel vom Dach gefallen. Wovon rede ich denn die ganze Zeit?


  • Mod

    Dachdecker schrieb:

    Falls jemand von mir herausfindet wie man ein char array zurück gibt wäre ich ihm sehr verbunden.

    Gespaltene Persönlichkeit oder bloss zerstreut? 😕



  • Dachdecker schrieb:

    Falls jemand von mir herausfindet wie man ein char array zurück gibt wäre ich ihm sehr verbunden.

    Falls du es noch nicht mitbekommen hast: Das geht nicht.

    Ein Array existiert nach verlassen des Scopes, in dem es definiert wurde, nicht mehr. (hier am Ende der Funktion). Wie jede andere Variable auch.

    Du kannst den Speicher dafür dynamisch besorgen und den Zeiger darauf zurück geben.

    Aber was hast du gegen c_str von std::string ?
    Weißt du überhaupt was das macht?



  • Die Ausgabe funktioniert nur die Sache hat einen kleinen Haken.
    Eigentlich müsste ich ja E mit free(E) reinigen aber dann kann ich den Wert ja nicht mehr zurück geben :-(.

    #include <iostream>
    #include <string>
    #include <stdlib.h>
    using namespace std;
    
    char &my_function(string a)
    {
        char * E;
         E = (char *) malloc(a.size());
    
        for(int i=0;i<a.size();i++){
            E[i] = a[i];
        }
    
        char *s = E;
     //   free(E);
    
        return *s;
    
    }
    
    int main()
    {
        string dumm = "dumm";
    
        cout << &my_function(dumm);
        return 0;
    }
    


  • Die Sache hat nur einen Haken: du wirst dumm sterben.



  • manni66 schrieb:

    Dachdecker schrieb:

    Der Herr Dachdecker hätte aber gerne, wenn möglich C++ Strings :).
    Ich weiß nämlich vorher nicht wie lang manche eingaben werden bzw. ich hab auch kein bock mich darum zu

    Der Herr Dachdecker ist wohl einmal zuviel vom Dach gefallen. Wovon rede ich denn die ganze Zeit?

    Ich ging davon aus du meinst string als parameter 🙂
    Nicht als das was mit return ausgegeben wird.

    manni66 schrieb:

    Die Sache hat nur einen Haken: du wirst dumm sterben.

    🙄



  • Dachdecker schrieb:

    Die Ausgabe funktioniert nur die Sache hat einen kleinen Haken.
    Eigentlich müsste ich ja E mit free(E) reinigen aber dann kann ich den Wert ja nicht mehr zurück geben :-(.

    #include <iostream>
    #include <string>
    #include <stdlib.h>
    using namespace std;
    
    char &my_function(string a)
    {
        char * E;
         E = (char *) malloc(a.size());
    
        for(int i=0;i<a.size();i++){
            E[i] = a[i];
        }
    
        char *s = E;
     //   free(E);
    
        return *s;
    
    }
    
    int main()
    {
        string dumm = "dumm";
    
        cout << &my_function(dumm);
        return 0;
    }
    

    Häää?
    Ich denke du willst C++ Strings nutzen?
    malloc ist C und kein C++.

    Und so wie ich das auf den ersten Blick sehe in der SQLite-API wird ein const char* erwarten, den kriegst du von einem std::string per c_str Methode.

    Wo ist also dein Problem??

    Edit: Oder willst du X machen, denkst es geht per Y und anstatt nach X zu fragen, fragst du nach Y?!?


Log in to reply