Einem LPSTR etwas anfügen
-
Hallo,
Ich komme gerade mit dem Datentyp LPSTR nicht richtig klar. Ich habe die Variable des Types LPSTR mit "Hallo" initialisiert und würde dieser Variable jetzt gerne ein weiteres "Hallo" anhängen.
LPSTR lpStr = new TCHAR[200]; lpStr = "Hallo"; lpStr += "Hallo";
Das darf anscheinend so nicht sein, sagt die Error-Box. Die Fehlermeldung lautet: "IntelliSense: der Ausdruck muss einen ganzzahligen Enumerationstyp oder einen Enumerationstyp ohne Bereichseinschränkung aufweisen.".
Könnte mir da einer helfen?
-
Nutz std::string.
LPSTR ist nichts anderes als char*. std::string ist ein dynamisch wachsendes char-Array, da geht auch anhängen.
-
Okay, das wäre soweit kein Problem.
Ich hole mir den Text einer EditBox mit GetWindowText. Als Parameter soll allerdings eine Variable vom Typ LPSTR angegeben werden, in der dann der Text integriert wird. Ich müsste hier also mit LPSTR arbeiten. Ginge das auch anders, vielleicht mit String?
-
Benutze einfach einen CString statt LPSTR.
-
Navy schrieb:
Als Parameter soll allerdings eine Variable vom Typ LPSTR angegeben werden, in der dann der Text integriert wird. Ich müsste hier also mit LPSTR arbeiten. Ginge das auch anders, vielleicht mit String?
Nutzt .c_str() um ein read-only LPSTR zu bekommen &string[0] mit Schreibzugriff (Größe dann aber ausreichend).
-
std::string
funktioniert gut mitchar*
bzw.LPSTR
zusammen.#include <Windows.h> #include <string> int main() { // Von LPSTR.. LPSTR pText = "Hello"; // .. nach std::string konvertieren std::string text(pText); // Text anhängen text += " John"; }
Funktionen mit Strings nehmen meistens einen
LPCSTR
(achte aucf das C), d.h. einenconst char*
als Argument. Dazu bietetstd::string
die Methodec_str()
an (Achtung: der Rückgabewert davon ist nur solange gültig wie dasstd::strin
Objekt selbst und es nicht verändert wird).Falls als Funktionsargument tatsächlich ein
LPSTR
verlangt wird, wäre mein erster Gedankestd::vector<char>
mitdata()
zu verwenden.
(Edit: oder wie Nathan vorgeschlagen hat)
-
Der TE will GetWindowText benutzen. Da macht ein CString wesentlich mehr Sinn als ein std::string.
-
EOP schrieb:
Der TE will GetWindowText benutzen. Da macht ein CString wesentlich mehr Sinn als ein std::string.
Wenn er MFC verwendet, ja. Vielleicht aber auch die WinAPI.
-
Vielen Dank euch allen. Es hat mit &_string[0] funktioniert.
-
Navy schrieb:
&_string[0]
Underscore am Anfang ist eine blöde Idee. (§ 2.10.3.2)
-
Nathan schrieb:
&string[0] mit Schreibzugriff (Größe dann aber ausreichend).
Darf man da seit C++11 auch reinschreiben oder wie?
-
Wenn der String lang genug ist ... warum nicht?
-
Ich meine mich zu erinnern dass das mit C++03 nicht erlaubt war.
-
-
hustbaer schrieb:
Ich meine mich zu erinnern dass das mit C++03 nicht erlaubt war.
Genau, mit C++03 war das nicht erlaubt.
AFAIK ist das mit C++11 erlaubt, zumindest ist der darunterliegende Speicher zwingend zusammenhängend, wie bei
std::vector<..>
. Allerdings vermisse ich beistd::string
die non-constdata()
-Methode, was wohl ein Defect ist (http://cplusplus.github.io/LWG/lwg-active.html#2391).
-
Nathan schrieb:
EOP schrieb:
Der TE will GetWindowText benutzen. Da macht ein CString wesentlich mehr Sinn als ein std::string.
Wenn er MFC verwendet, ja. Vielleicht aber auch die WinAPI.
CString ist eine frei verfügbares Template das nicht nur mit der MFC verwendet werden kann. Das geht auch mit ATL...
-
Swordfish schrieb:
Meinst Du http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530 ?
Ich weiss ehrlich gesagt nicht was das Problem/der Grund bei C++03 war. Hab mir nur gemerkt dass es nicht erlaubt ist.
-
Es war schlicht ein Designfehler im Standard. Man dachte daß man Implementierungen eine Freiheit in Form der Möglichkeit von nichtzusammenhängenden Puffern lassen wollte. Keine Implementierung (die ich kenne, gibts eine?) hat jedoch davon gebrauch gemacht so daß es de facto auch vor C++11 funktioniert hat. Mit C++11 kam lediglich die formale Forderung nach einem Puffer am Stück so wie es auch in C++03 für
std::vector<>
garantiert war.
-
hustbaer schrieb:
Swordfish schrieb:
Meinst Du http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530 ?
Ich weiss ehrlich gesagt nicht was das Problem/der Grund bei C++03 war. Hab mir nur gemerkt dass es nicht erlaubt ist.
War das nicht wegen der COW-Optimierung?
-
de jure? ja. auch.
edit: *linkausgrab* http://stackoverflow.com/a/22148550/3975177
-
Wiedermal - was hat die ganze ausgeartete Diskussion mit der eigentlichen Frage zu tun?
Nix, nix, nix.