Problem mit char* im return



  • Hi hab ein kleines Problem, bei dem ich einfach nicht die Lösung finde:

    char Get();
    
    int main()
    {
        char* c2;
    
        *c2 = Get();
        cout << *c2;
    
        return 0;
    }
    
    char Get() {
        char *a = "Hihi";
        return *a;
    }
    

    Ich möchte einfach ein char oder char*(weiß net was besser ist) aus der Funktion zurückgeben und dann in main in einem char* speichern.
    Was ich jetzt noch brauche ist, dass nicht nur ein "H" ausgegeben wird.

    Hoffe jemand kann mir helfen.

    Dankeschön im Voraus PhiLLe



  • #include <string>
    using namespace std;
    
    char Get();
    
    int main()
    {
        string c2;
        c2 = Get();
        cout << c2 << endl;
        return 0;
    }
    
    string Get() {
        string a = "Hihi";
        return a;
    }
    


  • Ja, Danke!

    Aber ich brauche in der main() char* um den text in eine andere Funktion zu übergeben.

    PhiLLe



  • oder wenn du es ohne der String-Klasse machen möchtest:

    char* Get();
    
    int main()
    {
        char* c2;
    
        c2 = Get();
        cout << c2;
    
        return 0;
    }
    
    char* Get() {
        char *a = "Hihi";
        return a;
    }
    


  • Vielen dank euch beiden!

    Mit den Pointern hab ich nochs so...

    MfG PhiLLe



  • PhiLLe schrieb:

    Ja, Danke!

    Aber ich brauche in der main() char* um den text in eine andere Funktion zu übergeben.

    PhiLLe

    wozu gibt es bitte schön die Methothe c_str im std::string?



  • Ich arbeite eben lieber mit char(ändert sich vielleicht hiernach)

    Es hat zwar geklappt jetzt den char* aus der Funktion zu bekommen, aber ich hab jetzt noch ein Problem...
    Ich hab nämlich einen Integer der immer erst in den char* in der Get() funktion umgewandelt wird. Da liegt wahrscheinlich der Fehler, weil ich erst

    char = int

    und dann

    char* = char

    mache.

    Bitte schaut es euch an und sagt mir was ich falsch mache.

    #include <iostream>
    using namespace std;
    
    char* Get();
    void Draw(char* c); //Simuliert andere Funktion(eigendlich egal)
    
    int main()
    {
        char* c2;
    
        c2 = Get();
        cout << c2 << endl; // = Irgendwas
        Draw(c2);
    
        return 0;
    }
    
    char* Get() {
        int i = 20; //Simuliert ein Integer, der ständig wechselt
        char b[20];
        char *a;
        itoa(i , b, 10);
        cout << b << endl; // = 20
        a = const_cast<char*>(b); //Ich convertiere erst zu char und dann zu char*(weil ich es nicht besser weiß)
        cout << a << endl; // = 20
        return a;
    }
    
    void Draw(char* c) {
        cout << c << endl; // = Irgendwas
    }
    


  • Phille schrieb:

    Ich arbeite eben lieber mit char(ändert sich vielleicht hiernach)...

    JETZT ist der Zeitpunkt, das zu ändern. Du hattest schon mit Deinem aktuellen Problem mehr Zeit vertändelt, als Dich die Einarbeitung in und die Lösung mit string gekostet hätte. Ich weiß, es kostet immer Überwindung, den bekannten Weg zu verlassen, aber hier lohnt es sich wirklich.

    Sagen wir mal so: Dein komplettes Programm entfällt eigentlich, wenn Du die StdLib-Hilfsmittel einsetzt.

    #include <iostream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    int getVal(); // warum nicht gleich den int zurückgeben ?
    void draw(string const& s); //Simuliert andere Funktion(eigendlich egal)
    
    int main()
    {
       ostringstream ostr;
       ostr << getVal(); // ostr kann man noch auf Fehler abfragen, der hier aber nicht auftreten kann
       cout << ostr.str() << endl;
       Draw(ostr.str());
    
       return 0;
    }
    
    int Get() {
        return 20; //...
    }
    
    void Draw(string const& str) {
        cout << str << endl; // = Irgendwas
    }
    

    Merke: Kein cast (der sowieso "falsch" wär), kein itoa() (sowieso non-Standard), keine Bufferoverflow-Gefahr, keine Gefahr eines Konvertierungsproblems, ....

    Gruß,

    Simon2.



  • Danke! Das hilft mir schonmal.
    Ich hab nur noch das Problem, das ich die draw Funktion nicht ändern kann, weil sie ein fester Bestandteil von einer libary ist(also ein Befehl).

    Wie kann ich das machen das ich den ostringstream als char* benutzen kann?

    Gruß



  • ostr.str().c_str()
    

    liefert den char* im string im ostringstream 🙂



  • Phille schrieb:

    ...
    Wie kann ich das machen das ich den ostringstream als char* benutzen kann?

    Gruß

    Vielleicht ist di aufgefallen, dass ich Draw gar keinen ostrngstream übergeben sondern einen string. Dafür hat ostringstream die Funtion str().
    Genauso hat string die Funktion c_str(), um einen char const * zu bekommen (und mehr als einen "const" sollte ein Funktion namens "Draw()" auch nicht brauchen).

    Gruß,

    Simon2.



  • Oh man...
    Ist zwar char* aber const.
    Sh*t!

    Const nimmt er nicht.

    Gibt es eine möglichkeit das wegzubekommen?

    Phille



  • Ups google gibts ja auch noch!
    Habs gefunden:

    char* str = new char[50];
    memcpy(str, ostr.str().c_str(), 50);
    

    Danke an alle für die Hilfe!

    PhiLLe



  • nur dass du statt der hardcodierten 50 schon die Länge des strings im ostringstream nehmen solltest, sonst gibts wieder bufferproblemchen



  • PhiLLe schrieb:

    Oh man...
    Ist zwar char* aber const.
    Sh*t!...

    Auftrag an Dich: 6-12 Schläge mit der Rute an den Programmierer von Draw() austeilen.
    Die ersten 2/3 Hälfte für das fehlende const und das letzte für char* statt string.

    Gruß,

    Simon2.



  • PhiLLe schrieb:

    Ups google gibts ja auch noch!
    Habs gefunden:

    char* str = new char[50];
    memcpy(str, ostr.str().c_str(), 50);
    

    Danke an alle für die Hilfe!

    PhiLLe

    hier wäre noch zu erwähnen, dass es hässlich ist, sich selbst um die dynamische speicherverwaltung zu kümmern weil immer viel zu viel schiefgeht und du am ende nur memory leaks hast. verwende std::vector (im kommenden standard gibt es eventuell std::dynarray , das für diesem fall besser geeignet wäre):

    #include <vector>
    //...
    
    vector<char> str(your_string.begin(), your_string.end()); //no new, no delete
    Draw (&str[0]);
    


  • Simon2 schrieb:

    PhiLLe schrieb:

    Oh man...
    Ist zwar char* aber const.
    Sh*t!...

    Auftrag an Dich: 6-12 Schläge mit der Rute an den Programmierer von Draw() austeilen.
    Die ersten 2/3 Hälfte für das fehlende const und das letzte für char* statt string.

    Und 5/3 weil Draw nicht Unicode fähig ist, ach das wäre sie ja mit std::string auch nicht.



  • unicoder schrieb:

    ...Und 5/3 weil Draw nicht Unicode fähig ist, ach das wäre sie ja mit std::string auch nicht.

    🤡 🤡
    Nochmal je 5, weil string nicht multithreadfähig, C++ nicht javafähig und Selbstprogrammieren sowieso nicht DAU-sicher ist.....

    Gruß,

    Simon2.


Anmelden zum Antworten