Problem mit c_str()



  • Hallo Leute!
    Ich versuche gerade, den Rückgabewert folgender Funktion in einer MessageBox auszugeben:

    #include <string>
    using namespace std;
    
    //Beispiel
    const char * testfunktion()
    {
         string sAusgabe="Hallo du da!";
         return sAusgabe.c_str();
    }
    
    //[..]
    //Aufruf der Messagebox
    MessageBox(0,testfunktion(),"Test",MB_OK);
    

    Das kompilieren und linken läuft problemlos - doch ich kann leider kein "hallo
    du da" in der Messagebox erkennen.. 😞

    PS: Das ganze funktioniert natürlich, wenn ich eine Variable in der
    Funktion mit dem Inhalt "hallo du da" vom typ const char * zurückgebe
    (es muss also irgendwas mit der Funktion c_str() zu tun haben 🙄 😞

    Ich hoffe, ihr könnt mir helfen
    euer Blubbblubb 😃 🙂



  • schau dir mal das beispiel an:

    Wollen Sie bei solchen Nachrichten-Boxen bei Angabe von mehreren Schaltflächen auswerten, ob den nun der OK-Button oder der ABBRECHEN-Button gedrückt wurde, müssen Sie nur den Rückgabewert der Funktion MessageBox() auswerten:

    if(MessageBox(NULL, "Fehler beim Erstellen des Fensters!",
        "Error!",MB_ICONEXCLAMATION | MB_OKCANCEL) == IDOK);
              //OK-Button wurde betätigt
    else
              //Abbrechen wurde betätigt
    

    Bei Rückgabe von IDOK wurde die OK-Schaltfläche betätigt und ansonsten ABBRECHEN.

    cu surf.



  • const char * testfunktion() 
    { 
         string sAusgabe="Hallo du da!"; 
         return sAusgabe.c_str(); 
    } 
    
    //[..] 
    //Aufruf der Messagebox 
    MessageBox(0,testfunktion(),"Test",MB_OK);
    

    schritt für schritt:
    1. string sAusgabe="Hallo du da!";
    sAusgabe wurd auf dem stack angelegt und allokiert sich speicher für "Hallo du da!"
    2. sAusgabe.c_str();
    Du bekommst nen Zeiger auf den speicherblock mit "Hallo du da!".
    3. return
    Du springst aus der funktion raus. Alle lokalen objecte auf dem stack geleöscht.
    4. string::~string()
    Der speicherblock mit dem "Hallo du da!" wird gelöscht, da das obejct zerstört wird.

    5. testfunktion() gibt nen zeiger zurück der auf nen Speicherblock zeigt den es nicht meh gibt.



  • To create a message box, use the MessageBox() function. Its syntax is:

    int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
    
    #include <string> 
    using namespace std; 
    
    //Beispiel 
    string testfunktion() 
    { 
         string sAusgabe="Hallo du da!"; 
         return sAusgabe.c_str();  // oder return sAusgabe;
    } 
    
    //[..] 
    //Aufruf der Messagebox 
    MessageBox(0,testfunktion(),"Test",MB_OK);
    

    sag mir ob das geht!!

    cu



  • @surf.: Irgendwie kann ich den Zusammenhang zwischen deinen Postings und diesem Thread nicht so recht erkennen 🙄

    Außerdem hat CMatt doch bereits geschrieben, warum der ganz zu Beginn gepostete Code nicht funktioniert 😉



  • sag mir ob das geht!!
    cu

    nö, geht nicht, siehe meinen post oben 🤡 :p



  • nö.. jetzt geht's aber 😃 :

    string testfunktion()
    {
         string sAusgabe="Hallo du da!";
         return sAusgabe;
    }
    
    MessageBox(0,testfunktion().c_str(),"Test",MB_OK);
    


  • CMatt schrieb:

    sag mir ob das geht!!
    cu

    nö, geht nicht, siehe meinen post oben 🤡 :p

    #include <string> 
    using namespace std; 
    
    //Beispiel 
    string testfunktion() 
    { 
         string sAusgabe;
         sAusgabe="Hallo du da!"; 
         return sAusgabe; 
    } 
    
    //[..] 
    //Aufruf der Messagebox 
    MessageBox(0,testfunktion().c_str(),"Test",MB_OK);
    

    probier das mal, ich kann mich erinnern das es glaubi so funzte!

    cu



  • thx für eure ganzen Antworten!
    Wisst ihr vielleicht, wie ich jetzt zum Beispiel

    testfunktion().c_str();
    

    in einem Fenster per TextOut(..) ausgeben kann, ohne dass
    die Ausgabe "abgehackt" wird oder noch etwas angehängt wird?

    euer blubbblubb 😃



  • blubbblubb schrieb:

    nö.. jetzt geht's aber 😃 :

    string testfunktion()
    {
         string sAusgabe="Hallo du da!";
         return sAusgabe;
    }
    
    MessageBox(0,testfunktion().c_str(),"Test",MB_OK);
    

    Ich denke aber nicht, dass das immer zuverlässig so funktioniert 🙄

    Zu deinem 2. Problem: Du musst einfach im letzten Parameter (cbString) von TextOut die richtige Länge angeben 😉



  • Schau in der Hilfe zu TextOut, wie die Funktion aufgerufen wird. Wenn es nicht funktioniert, kannst du immer noch hier fragen (und deinen Ansatz posten). 🙄



  • @flenders

    Ich denke aber nicht, dass das immer zuverlässig so funktioniert 🙄

    string testfunktion()
    {
         string sAusgabe="Hallo du da!";
         return sAusgabe;
    }
    
    MessageBox(0,testfunktion().c_str(),"Test",MB_OK);
    

    Wieso soll das nicht immer zuvelässig funktionieren ?? 😮

    Gruß



  • flenders schrieb:

    Zu deinem 2. Problem: Du musst einfach im letzten Parameter (cbString) von TextOut die richtige Länge angeben 😉

    Öhm ja...
    mit welcher Funktion bekomm' ich denn die Länge? 🙄

    Dies hier klappt nur bei 2,4,6,8,... chars:

    const char * cAusgabe = testfunktion().c_str();
    TextOut(hdc,1,1,cAusgabe,sizeof(cAusgabe) * 2);
    


  • blubbblubb schrieb:

    const char * cAusgabe = testfunktion().c_str();
    TextOut(hdc,1,1,cAusgabe,sizeof(cAusgabe) * 2);
    

    cAusgabe ist ein "const char*", also ein Zeiger. Und ein Zeiger hat auf 32-Bit-CPUs nunmal immer 4 Bytes, egal wie groß der String ist, auf den er zeigt. Du suchst std::string::length() oder lstrlen() (wobei ersteres schneller sein dürfte):

    string Ausgabe = testfunktion();
    TextOut(hdc, 1, 1, Ausgabe.c_str(), Ausgabe.length());
    


  • Skatepirat schrieb:

    Wieso soll das nicht immer zuvelässig funktionieren ?? 😮

    Das hatte ich aus den Ausführungen von CMatt geschlossen 🤡


Anmelden zum Antworten