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ätigtBei 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!!
cunö, 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!!
cunö, 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 Beispieltestfunktion().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).

-
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
