Разбор аргументов командной строки в приложении Юникод C ++ - PullRequest
9 голосов
/ 02 декабря 2008

Как я могу разобрать целые числа, переданные приложению, в качестве аргументов командной строки, если приложение имеет Unicode?

Unicode-приложения имеют следующее:

int _tmain(int argc, _TCHAR* argv[])

argv [?] - это wchar_t *. Это означает, что я не могу использовать Atoi. Как я могу преобразовать его в целое число? Является ли stringstream лучшим вариантом?

Ответы [ 4 ]

7 голосов
/ 02 декабря 2008

если у вас есть массив TCHAR или указатель на его начало, вы можете использовать std::basic_istringstream для работы с ним:

std::basic_istringstream<_TCHAR> ss(argv[x]);
int number;
ss >> number;

Теперь number - преобразованное число. Это будет работать в режиме ANSI (_TCHAR определен с типом char) и в Unicode (_TCHAR определен с типом как wchar_t, как вы сказали).

3 голосов
/ 02 декабря 2008

TCHAR - это символьный тип, который работает как для ANSI, так и для Unicode. Посмотрите в документации MSDN (я предполагаю, что вы находитесь в Windows), есть эквиваленты TCHAR для atoi и все основные строковые функции (strcpy, strcmp и т. Д.)

Эквивалент TCHAR для atoi () равен _ttoi (). Таким образом, вы могли бы написать это:

int value = _ttoi(argv[1]);
1 голос
/ 21 января 2013

Сухое кодирование, и я не разрабатываю для 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;
}
1 голос
/ 02 декабря 2008

Лично я бы использовал 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...