C++ WCHAR Manipulationen
Entwickle ich eine kleine Win32-Anwendung in C++.
Ich habe studiert C++ Grundlagen vor langer Zeit, so dass ich nun vollkommen verwirrt, weil der Zeichenketten in C++. Es gab keine WCHAR
oder TCHAR
nur char
und String
.
Nach einer kleinen Untersuchung habe ich beschlossen, nicht zu verwenden TCHAR
.
Mein Problem ist ganz einfach, denke ich, aber ich finde keine klare Anleitung, wie Sie zu manipulieren strings in C++. Betroffen von PHP coding letzten paar Jahren habe ich erwartet, dass etwas, das einfach mit Streichern Manipulationen und war falsch!
Einfach, alles, was ich brauche, ist, um neue Daten in eine Zeichenfolge um.
WCHAR* cs = L"\0";
swprintf( cs, "NEW DATA" );
Dies war mein Erster Versuch. Beim Debuggen meiner app habe ich untersucht, swprintf stellt nur die ersten 2 chars auf meinem cs var. Ich habe gelöst mein problem auf diese Weise:
WCHAR cs[1000];
swprintf( cs, "NEW DATA" );
Aber in der Regel diesen trick scheitern könnte, da in meinem Fall neue Daten nicht konstanter Wert, sondern eine andere variable, das könnte potentialy breiter sein, als 1000 chars lang. Und mein code sieht wie folgt aus:
WCHAR cs[1000];
WCHAR* nd1;
WCHAR* nd2;
wcscpy(nd1, L"Some value");
wcscpy(nd2, L"Another value"); //Actually these vars stores the path for user selected folder
swprintf( cs, "The paths are %s and %s", nd1, nd2);
In diesem Fall gibt es die Möglichkeit, als nd1 und nd2 gesamtzeichenzahl könnte größer sein als 1000 chars so wichtige Daten verloren.
Die Frage ist, wie kann ich kopieren Sie alle Daten, die ich brauche, um WCHAR-string deklariert diese Weise WCHAR* wchar_var;
ohne alles zu verlieren?
P. S. Da bin ich auf Russisch die Frage unklar ist. Lassen Sie mich nun zu diesem, und ich werde versuchen zu erklären, mein Problem klarer und komplexer.
wchar_t
und std::wstring
. Und Lesen Sie ein wenig mehr über Zeiger, die Letzte code-snippet kopiert Daten mit nicht initialisierten Zeigern, das heißt, Sie überschreiben könnte etwas in den Speicher des Prozesses.Ich werde auf jeden Fall Lesen über Pointer!
Ich habe den tag
string
.Dann sollten Sie wissen, dass die Verwendung eines nicht initialisierten Zeiger ist schlecht, ja?
Ja, sicherlich! Ich habe gelernt, über Zeiger, wenn ich untersucht habe, in der Schule, aber das war vor langer Zeit, also muss ich mein wissen auffrischen. Vielen Dank!
InformationsquelleAutor Geradlus_RU | 2012-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der modernen Windows-Programmierung, es ist OK einfach zu ignorieren
TCHAR
und stattdessenwchar_t
(WCHAR
) und Unicode UTF-16.(
TCHAR
ist ein Modell der Vergangenheit, wenn Sie wollte, eine einzige code-Basis und produzieren sowohl ANSI/MBCS und Unicode-builds ändern einige Präprozessor-Schalter wie_UNICODE
undUNICODE
.)In jedem Fall sollten Sie die Verwendung von C++ und bequem string-Klassen um Ihren code zu vereinfachen. Sie können
ATL::CString
(das entsprichtCStringW
in Unicode-builds, die den Standard seit VS2005) oder STL iststd::wstring
.Mit
CString
Sie tun können:CString
bietet auch die richtige überlastungenoperator+
zum verketten von strings (so dass Sie nicht haben, um berechnen Sie die Gesamtlänge der resultierenden Zeichenkette, dynamisch reserviert einen Puffer für die Ziel-string oder überprüfen der vorhandenen Puffer-Größe, rufen Siewcscpy
,wcscat
, vergessen Sie nicht, lassen Sie die Puffer, etc).Und Sie können einfach vorbei kommen Instanzen von
CString
Win32-APIs erwartenconst wchar_t*
(LPCWSTR/PCWSTR
) Parameter, daCString
bietet eine implizite Konvertierung Betreiberconst wchar_t*
.Sie nicht haben, um vertraut sein mit ATL zu verwenden
CString
. Sie können nur#include <atlstr.h>
und verwendenCString
mit seinen praktischen Funktionen (einschließlich laden von Zeichenfolgen aus der Anwendung der Ressourcen).CString
ist besser integriert in die Win32-Programmierung alsstd::wstring
.Ich danke Ihnen sehr! Ich werde versuchen, es jetzt
InformationsquelleAutor Mr.C64
Wenn man mit einem
WCHAR*
, werden Sie den Aufruf undefiniert Verhalten, weil Sie einen Zeiger haben, aber nicht zeigen, bis alles gültig. Sie müssen herausfinden, wie lange der resultierende string wird dynamisch Speicherplatz für den string. Zum Beispiel:Aber das ist sehr unschön und fehleranfällig. Wie bereits erwähnt, sollten Sie mit Hilfe
std::wstring
statt, so etwas wie dieses:InformationsquelleAutor Dark Falcon
Empfehlen ATL
CStringW
Klasse statt rawWCHAR
, es ist viel mehr nützlich.CString
ist wrapper für dynamisch allozierten C-string. Sie verwaltet Länge der Zeichenfolge & reserviert Speicher Puffer entsprechend nach jeder operation, so dass Sie würde nicht interessieren.Typische Verwendung:
oder
CString
Instanz zu APIs erfordernconst WCHAR*
, daCString
bietet einen praktischen, implizitenconst wchar_t*
Betreiber für diesen Zweck.Ja, natürlich, aber mit expliziten
GetString()
vorzuziehen ist.Nein,
CString::GetString()
macht nur Sinn in Kontexten wieswprintf()
mit einemprintf
-wie format-string und%s
. Ich würde einfach direkt übergeben eineCString
- Instanz als argument an eine Funktion mit einemLPCWSTR
parameter.Ersten, vorbei
CString
alsprintf
-wie func-argument wird auch funktionieren, weilCString
ist Binär-kompatibel mitchar*
/wchar_t*
. Zweite, implizite Konvertierungen ist gefährlich und verwirrend. Explizite Konvertierungen werden stattdessen verwendet. Das ist, weilstd::string
hat keine solcheconst char*()
Betreiber.Die Tatsache, dass
CString
arbeitet mitprintf()
-ähnliche Funktionen ist eine Art "hack"; es ist kein robuster code. Sogar MSDN rät, dass die Verwendung und schlägt vor, einen expliziten cast (aber ich finde den Aufrufstr.GetString()
besser alsstatic_cast<const wchar_t*>(str)
). Darüber hinaus, vorbei anCString
zuconst wchar_t*
Parameter ist Prima (mirCString str; ... SetWindowText(hWnd, str);
ist OK, aberSetWindowText(hWnd, str.GetString());
ist ugly "code").InformationsquelleAutor Rost