Wie const wchar_t* userName einen String zuweisen ?
-
Hallo liebe C++er,
ich bin neu hier und habe eine Frage zum Zuweisen eines Strings auf eine vorgebenen WideCharPointer der Art:
const wchar_t* NutzerNameMit der Anweisung
. NutzerName=L"Irgendwer"; .akzeptiert es zwar der Kompilier (Visual Studio 2003, MFC 7.1), aber zur Laufzeit des Programmes erhalte ich jedoch die Meldung
"Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)"
Da ich mit C++ nur ganz wenig Erfahrungen habe, meine Fragen:
1. wie kann ich dem Nutzernahme einen String zuweisen, idealer Weise
mit einer einfachen Stringvariable ?2. Welche Literatur empfehlt Ihr zum Studium dieser Problematik ?
Mit besten Dank
Gerd
-
Sieh Dir mal
MultiByteToWideChar(...)bzw.
WideCharToMultiByte(...)an.
-
So eine Zuweisung ist sowieso problematisch. Du würdest hier nicht den String deiner Variablen zuweisen, sondern lediglich die Adresse (eines Literals). Da sollte man eher strcpy benutzen (oder das Unicode-Äquivalent). Nimm besser die Klasse std::string. Da kannst du Zuweisungen so machen, wie du es versucht hast.
std::wstring NutzerName=L"MeinName";
-
Besten Dank für Eure Tipps.
Ich denke MultiByteToWideChar wäre die Lösung, da der Datentype von Microsoft so vergeben ist.
in welcher include steckt denn aber
MultiByteToWideChar ?
Habe noch eine andere Funktion zur Wandlung gefunden:
void strcpy_cw(wchar_t *Dest, char *Src) { while (*Src) { *Dest++ = *Src++; } *Dest = 0; }mit dem Aufruf:
strcpy_cw(NutzerName,"Nobody");gehts aber auch nicht.
Beim Googlen finde ich nur ein Haufen Fragen zu diesem Thema, aber keine wirklich Antwort. Wo kann man sich den zu dieser unüberschaubaren Typendefinition mal wirklich einen Überblick verschaffen ?

-
Du mußt dich mal mit Arrays datentypen und vor allem was zeiger sind auseinander setzen. wenn du das nicht willst das nimm std::string wobei dich das auch net schützt dich mit zeigern zu beschäftigen.
was du in deinem ersten beitrag gemacht hast, du hast mit
const wchar_t* NutzerName;einen zeiger erstellt, nur dummerweise zeigt der auf nix, weil du keinen spiecherbereich (array) erzeugt hast wo dann dein zeiger mal draufzeigen könnte.
Richtiger is doch
wchar_t NutzerName[100]; strcpy_cw(NutzerName,"Nobody");also grundlagen lernen würde ich sagen
,wobei strcpy_cw wohl eher unfug ist, also das rad noch mal neu erfunden, denn das gibt es schon in den standart-bibliotheken und das sollte man auch verwenden, wenn mans net besser/schneller hin bekommt 
-
in welcher include steckt denn aber MultiByteToWideChar
In der Hilfe steht:
Header: Declared in Winnls.h; include Windows.h.
Library: Use Kernel32.lib.Da gibt es auch ein Beispiel.
Nutzen kannst Du es in etwa so://text: in //pText: out int MeineKlasse::StrToWChar(LPCSTR text,wchar_t* pText) { int ir=MultiByteToWideChar( CP_ACP, 0, text,-1, pText,0); if(ir) { ir=MultiByteToWideChar( CP_ACP, 0, text,-1, pText,ir); } if(!ir) { DWORD dw = GetLastError(); //etc. } return ir; }
-
Warum wird hier MFC Forum nicht die einfachen ATL Makros als Hilfe angeboten?
CA2W, CT2W etc...Zudem: Der primäre erste Fehler, des OP:
"Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)"
Liegt wohl eher an einem verdaddeltem Heap!