std::string in char-array wandeln
-
Hallo!
Wie mache ich das in C++? Ich hasse diese ganzen Grindfunktionen strcpy_s() usw...
Danke!
MfG
-
char szTip[64] = ("Hallo").c_str()
Funzt ned.
-
-
so:
const char* szTip = std::string("Hallo").c_str();
Gruß
Don06
-
Link schaue ich mir gleich an.
FF?
Leider habe ich nicht die Möglichkeit, den Datentyp von szTip zu verändern, da er von NOTIFIICONDATA stammt. (WINAPI)
MfG
-
c_str() scheint nicht die Lösung zu sein. Oder zumindest nicht diese Funktion allein...
-
Ich hatte das mal so gemacht:
template<class charT> class StringBuffer { public: StringBuffer(std::basic_string<charT>& string, std::size_t size) : ref(string), buf(new charT[size + 1]), bufsize(size) { } ~StringBuffer() { destroy(); } operator charT*() { return buf; } operator const charT*() const { return buf; } std::size_t size() const { return bufsize; } void sync() { if(buf) ref = buf; } void destroy() { sync(); delete [] buf; buf = 0; bufsize = 0; } private: std::basic_string<charT>& ref; charT* buf; std::size_t bufsize; }; // z.b. std::string mystring = "huhu"; winapi_func(StringBuffer<char>(mystring, 255));
War grade so ausm Kopf, muss also nicht so compilieren. Wenn der String nicht größer wird kannste auch const_cast nehmen (bis dir das die Standardfanatiker wieder ausreden...)
-
Danke, aber geht das nicht (VIEL) einfacher? Möglichst wenig code bitte.
-
In NOTIFYICONDATA ist ein TCHAR-Array, d.h. wenn du ein ASCII Build machst hast du ein char Array bei einem Unicode-Build ein wchar_t Array.
Wenn du dich nur auf Ascii beschränkst, dann kannst du direkt den std::string reinkopieren, sonst musst du vorher noch mit ToUnicode, oder einer der anderen Konvertierungsfunktionen den String umwandeln (MultiByteToWideChar z.B.)Wenn es nur ascii ist, dann mach es so:
std::string der_str; char* der_buffer; std::memcpy( der_buffer, der_str.c_str(), der_str.size() );
-
FF?
firefox.
hatte mich in dem moment wieder mit seiner absolut verbuggten copy/paste funktion angebrochen, so dass ich den link editieren musste.
-
Nixkopf schrieb:
Danke, aber geht das nicht (VIEL) einfacher? Möglichst wenig code bitte.
Klar, geht es.
NOTIFYICONDATA icondata; icondata.szTip = TEXT("Teststring");
-
Danke, aber...
cannot convert from 'const char [23]' to 'CHAR [64]'
MfG
-
Grr, daran hatte ich nicht gedacht. Dann eben doch 'copy'. Wo ist das Problem?
string str = "Hallo, Welt"; copy(str.begin(), str.end(), icondata.szTip);
-
Achso, ich dachte, das geht etwas mehr "rein C++".
Danke!
MfG
-
Nixkopf schrieb:
Achso, ich dachte, das geht etwas mehr "rein C++".
'copy' ist *absolut* "rein C++". Daher habe ich ja auch extra *nicht* 'strcpy' verwendet.
-
Oki, super.
MfG
-
Aber wenn szTip ein CHAR[64], dann gib ihm auch nur 64 Zeichen:
if (str.size () < 64) std::copy (str.begin (), str.end (), icondata.szTip); else { std::copy_n (str.begin (), 63, icondata.szTip); icondata.szTip[63] = '\0'; }
oder so ähnlich.
-
std::copy ist für sowas aber nicht gerade der effiziente Weg. Bei built-ins ist man mit einem std::mempcy besser dran.
-
Wird eh mit ner fixen Länge unter 64 beschrieben, daher unnötig.
MfG
-
lolz schrieb:
std::copy ist für sowas aber nicht gerade der effiziente Weg. Bei built-ins ist man mit einem std::mempcy besser dran.
Das hängt von vielen Faktoren - nicht zuletzt der Implementation von std::copy (die ohne weiteres memcpy benutzten kann) ab. Zudem ist die reine Laufzeitfrage - wenn du darauf abstellen willst - oft genug gar nicht das wesentliche Kriterium.