2010-11-18 11 views
0

So in Win32-API, ich habe meine Hauptfunktion so definiert: Wie konvertiere ich einen WCHAR * in einen regulären String?

wmain

(int argc, WCHAR * argv [])

ich einige Argumente bin es vorbei, und ich möchte auszuführen ein Wechselfall basierend auf dem Wert des Arguments, etwa so.

wmain(int argc, WCHAR* argv[]) 
{ 
    char* temp = argv[]; 
    switch (temp) { 
    case "one": blah blah; 
... 
} 

Natürlich ist die temp = argv [] funktioniert nicht, ich bin auf der Suche nach einem Vorschlag, es zu konvertieren. Im Moment habe ich ein Wenn-sonst-wenn-Ding, und es ist SEHR ineffizient!

Der Grund, warum ich es konvertieren muss, ist, weil ich einen Schalterfall auf einem WCHAR * nicht ausführen kann.

Danke fürs schauen.

Antwort

0

Ich bin mir nicht sicher, ob dies eine gute Idee ist. Ein WCHAR * könnte Unicode-Zeichen enthalten, die nicht sinnvoll auf ein char * abgebildet werden können. Falls Sie dies ignorieren möchten, gibt es einen Forenbeitrag unter http://www.codeguru.com/forum/showthread.php?t=336106, der einige Vorschläge für die Konvertierung von WCHAR * nach char * enthält.

+0

Das OP versucht, ASCII-Zeichen in Zahlen zu konvertieren. Er beginnt mit einem WCHAR * für die Befehlszeile. Es ist unwahrscheinlich, dass er japanische Zeichen in die Konsole eingibt! –

2

Sie können auch keinen Schalter für ein Zeichen * ausführen. (Aber wenn Sie tatsächlich benötigen, um WCHAR * zu umwandeln * verkohlen, verwenden WideCharToMultiByte)

Sie müssen if/else if mit lstrcmpi, CompareString oder einem anderen String-Funktion vergleichen.

Alternativ kann einer der Bibliotheken Parameterparser verwenden wie argtable oder getopt

+0

Derzeit verwende ich if/else, aber es gibt 25 Bedingungen und es ist extrem ineffizient. Außerdem darf ich keine Bibliotheken von Drittanbietern verwenden. Irgendwelche anderen Vorschläge? – Freakishly

+0

Wenn Sie einen Schalter verwenden möchten, der schlecht ist, könnten Sie wahrscheinlich das Eingabeargument hashen und vorberechnete Hashes für die Case-Anweisungen verwenden. – Anders

+0

Es gibt einen einfacheren Weg: ATL-Konvertierungs-Makros - T2A() –

0

Probieren Sie es aus std :: wstring Umwandlung std :: string, ist es einfach, vielleicht gibt es einen kürzeren Weg.

Convert WCHAR * std :: wstring mit std :: wstring constractor und dann eine von std :: wstring Methode verwenden, um std :: zu konvertieren String

0

Hier ist ein kurzes Beispiel ich vor einiger Zeit schrieb.

Erstellen Sie eine neue win32-Konsolenanwendung und wählen Sie ATL-Unterstützung. Fügen Sie diese und kompilieren/run ...

#include "stdafx.h" 
#include <iostream> 

using namespace std; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
// A _TCHAR is a typedef'd, depending on whether you've got a unicode or MBCS build 

// ATL Conversion macros are documented here 
// http://msdn.microsoft.com/en-us/library/87zae4a3(VS.80).aspx 
// Declare USES_CONVERSION in your function before using the ATL conversion macros 
// e.g. T2A(), A2T()  
USES_CONVERSION; 

TCHAR* pwHelloWorld = _T("hello world!"); 
wcout << pwHelloWorld << endl; 

// convert to char 
char* pcHelloWorld = T2A(pwHelloWorld); 
cout << pcHelloWorld << endl; 


cin.get(); 

return 0; 
} 

Natürlich können Sie nicht auf eine Saite wechseln, aber das sollte Ihnen die Informationen, die Sie benötigen, um eine WCHAR in ein Zeichen zu lesen. Von dort können Sie leicht in int konvertieren. Hope dies hilft;)