2010-11-18 4 views
0

Ainsi dans l'API Win32, j'ai ma fonction principale ainsi définie:Comment convertir un WCHAR * en une chaîne normale?

wmain (int argc, WCHAR * argv [])

Je passe quelques arguments, et je voudrais exécuter un commutateur basé sur la valeur de l'argument, quelque chose comme ça.

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

Bien sûr, la température = argv [] ne fonctionne pas, je suis à la recherche d'une suggestion pour le convertir. En ce moment, j'ai un truc si-sinon-si, et c'est TRÈS inefficace!

La raison pour laquelle je dois convertir est parce que je ne peux pas exécuter un cas de commutateur sur un WCHAR *.

Merci de votre visite.

Répondre

0

Je ne sais pas si c'est une bonne idée à faire. Un WCHAR * peut contenir des caractères Unicode qui ne peuvent pas être mappés à un char * de manière significative. Au cas où vous voudriez ignorer ceci, il y a un message de forum au http://www.codeguru.com/forum/showthread.php?t=336106 qui a quelques suggestions pour convertir de WCHAR * en char *.

+0

L'OP essaie de convertir les caractères ASCII en nombres. Il commence avec un WCHAR * pour la ligne de commande. Il est peu probable qu'il va entrer des caractères japonais sur la console! –

2

Vous ne pouvez pas non plus exécuter un commutateur sur un caractère *. (Mais quand vous avez réellement besoin de convertir WCHAR * char *, utilisez WideCharToMultiByte)

Vous devez utiliser if/else si avec lstrcmpi, CompareString ou une autre chaîne fonction de comparaison.

Vous pouvez également utiliser l'une des bibliothèques de l'analyseur de paramètres comme argtable ou getopt

+0

Actuellement j'utilise if/else, mais il y a 25 conditions et c'est extrêmement inefficace. En outre, je ne suis pas autorisé à utiliser des bibliothèques tierces. D'autres suggestions? – Freakishly

+0

Si vous voulez utiliser un commutateur aussi mauvais, vous pouvez probablement hacher l'argument d'entrée et utiliser des hachages précalculés pour les instructions case. – Anders

+0

Il existe un moyen plus simple: les macros de conversion ATL - T2A() –

0

Essayer conversion de std :: wstring à std :: string, il est facile, peut-être il y a un moyen plus court.

Convertir WCHAR * à std :: wstring en utilisant std :: wstring constractor, puis utilisez l'une des std :: méthode wstring pour convertir en std :: string

0

Voici un exemple rapide je l'ai écrit il y a quelque temps.

Créez une nouvelle application de console win32 et sélectionnez le support ATL. Ajouter cette compilation et/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; 
} 

Bien sûr, vous ne pouvez pas passer sur une chaîne, mais cela devrait vous donner les informations dont vous avez besoin pour lire un WCHAR en char. De là, vous pouvez convertir en int assez facilement .. Espérons que cela aide;)

Questions connexes