Analyse des arguments de ligne de commande dans une application C ++ unicode

Comment parsingr les entiers transmis à une application en tant qu’arguments de ligne de commande si l’application est unicode?

Les applications Unicode ont un principal comme ceci:

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

argv [?] est un wchar_t *. Cela signifie que je ne peux pas utiliser atoi. Comment puis-je le convertir en entier? Ssortingngstream est la meilleure option?

si vous avez un tableau TCHAR ou un pointeur au début de celui-ci, vous pouvez utiliser std::basic_issortingngstream pour le std::basic_issortingngstream :

 std::basic_issortingngstream<_tchar> ss(argv[x]); int number; ss >> number; 

Maintenant, number est le nombre converti. Cela fonctionnera en mode ANSI (_TCHAR est typé en caractère) et en Unicode (_TCHAR est typé en wchar_t comme vous dites).

Un TCHAR est un type de caractère qui fonctionne à la fois pour ANSI et Unicode. Consultez la documentation MSDN (je suppose que vous utilisez Windows), il existe des équivalents TCHAR pour atoi et toutes les fonctions de base des chaînes (strcpy, strcmp, etc.).

L’équivalent TCHAR pour atoi () est _ttoi (). Pour que vous puissiez écrire ceci:

 int value = _ttoi(argv[1]); 

ssortingngstreams , je voudrais utiliser ssortingngstreams , voici du code pour vous ssortingngstreams à démarrer:

 #include  #include  using namespace std; typedef basic_issortingngstream<_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; } } 

TCLAP à TCLAP , je ne développe pas sous Windows, mais avec TCLAP , vous devriez pouvoir utiliser des valeurs argv caractères larges:

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