Разбор аргументов командной строки в приложении Unicode С++
Как я могу анализировать целые числа, переданные в приложение в качестве аргументов командной строки, если приложение является unicode?
Юникод-приложения имеют такое же значение:
int _tmain(int argc, _TCHAR* argv[])
argv [?] - wchar_t *. Это означает, что я могу использовать atoi. Как я могу преобразовать его в целое число? наилучшим вариантом является stringstream?
Ответы
Ответ 1
если у вас есть массив TCHAR или указатель на его начало, вы можете использовать std::basic_istringstream
для работы с ним:
std::basic_istringstream<_TCHAR> ss(argv[x]);
int number;
ss >> number;
Теперь number
- преобразованное число. Это будет работать в режиме ANSI (_TCHAR typedef'ed до char
), а в Unicode (_TCHAR - это typedef`ed для wchar_t, как вы говорите).
Ответ 2
TCHAR - это тип символа, который работает как для ANSI, так и для Unicode. Посмотрите в документации MSDN (я предполагаю, что вы находитесь в Windows), существуют эквиваленты TCHAR для atoi и всех основных функций строки (strcpy, strcmp и т.д.).
Эквивалент TCHAR для atoi() равен _ttoi(). Поэтому вы можете написать это:
int value = _ttoi(argv[1]);
Ответ 3
Я лично использовал бы stringstreams
, вот какой код, чтобы вы начали:
#include <sstream>
#include <iostream>
using namespace std;
typedef basic_istringstream<_TCHAR> ITSS;
int _tmain(int argc, _TCHAR *argv[]) {
ITSS s(argv[0]);
int i = 0;
s >> i;
if (s) {
cout << "i + 1 = " << i + 1 << endl;
}
else {
cerr << "Bad argument - expected integer" << endl;
}
}
Ответ 4
Сухая кодировка, и я не разрабатываюсь в Windows, но используя TCLAP
, это должно заставить вас работать с широким символом argv
значения:
#include <iostream>
#ifdef WINDOWS
# define TCLAP_NAMESTARTSTRING "~~"
# define TCLAP_FLAGSTARTSTRING "/"
#endif
#include "tclap/CmdLine.h"
int main(int argc, _TCHAR *argv[]) {
int myInt = -1;
try {
TCLAP::ValueArg<int> intArg;
TCLAP::CmdLine cmd("this is a message", ' ', "0.99" );
cmd.add(intArg);
cmd.parse(argc, argv);
if (intArg.isSet())
myInt = intArg.getValue();
} catch (TCLAP::ArgException& e) {
std::cout << "ERROR: " << e.error() << " " << e.argId() << endl;
}
std::cout << "My Int: " << myInt << std::endl;
return 0;
}