Как преобразовать WCHAR * в обычную строку?

Итак, в Win32 API моя основная функция определена следующим образом:

wmain(int argc, WCHAR* argv[])

Я передаю ему некоторые аргументы, и я хотел бы выполнить случай переключения на основе значения аргумента, что-то вроде этого.

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

Конечно, temp=argv[] не работает, я ищу предложение по его преобразованию. Прямо сейчас у меня происходит «если-иначе-если», и это ОЧЕНЬ неэффективно!

Причина, по которой мне нужно преобразовать его, заключается в том, что я не могу выполнить случай переключения в WCHAR*.

Спасибо, что посмотрели.


person Freakishly    schedule 18.11.2010    source источник


Ответы (4)


Вы также не можете выполнить переключатель на char*. (Но когда вам действительно нужно преобразовать WCHAR* в char*, используйте WideCharToMultiByte)

Вам нужно использовать if/else if с lstrcmpi, CompareString или какая-либо другая функция сравнения строк .

В качестве альтернативы можно использовать одну из библиотек анализаторов параметров, например argtable или getopt

person Anders    schedule 18.11.2010
comment
Сейчас я использую if/else, но там 25 условий и это крайне неэффективно. Кроме того, мне не разрешено использовать сторонние библиотеки. Любые другие предложения? - person Freakishly; 19.11.2010
comment
Если вы хотите использовать переключатель так плохо, вы, вероятно, могли бы хэшировать входной аргумент и использовать предварительно вычисленные хэши для операторов case. - person Anders; 19.11.2010
comment
Есть более простой способ: макросы преобразования ATL - T2A() - person ; 21.11.2010

Я не уверен, что это хорошая идея. WCHAR* может содержать символы Юникода, которые не могут быть осмысленно сопоставлены с char*. Если вы хотите проигнорировать это, есть сообщение на форуме по адресу http://www.codeguru.com/forum/showthread.php?t=336106, в котором есть несколько предложений по преобразованию из WCHAR* в char*.

person Jan Thomä    schedule 18.11.2010
comment
ОП пытается преобразовать символы ASCII в числа. Он начинает с WCHAR* для командной строки. Маловероятно, что он собирается вводить какие-либо японские символы в консоль! - person ; 21.11.2010

Попробуйте преобразовать его из std::wstring в std::string, это легко, возможно, есть более короткий путь.

Преобразуйте WCHAR* в std::wstring с помощью конструктора std::wstring, а затем используйте один из методов std::wstring для преобразования в std::String.

person snoofkin    schedule 18.11.2010

Вот краткий пример, который я написал некоторое время назад.

Создайте новое консольное приложение win32 и выберите поддержку ATL. Добавьте это и скомпилируйте/запустите...

#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;
}

Конечно, вы не можете включить строку, но это должно дать вам информацию, необходимую для чтения WCHAR в char. Оттуда вы можете достаточно легко преобразовать в int. Надеюсь, это поможет;)

person Community    schedule 19.11.2010