smart - Análisis de los argumentos de la línea de comando en una aplicación Unicode C++
smart contracts ethereum (4)
¿Cómo puedo analizar los enteros pasados a una aplicación como argumentos de línea de comandos si la aplicación es unicode?
Las aplicaciones Unicode tienen una principal como esta:
int _tmain(int argc, _TCHAR* argv[])
argv [?] es un wchar_t *. Eso significa que puedo usar atoi. ¿Cómo puedo convertirlo a un número entero? Qué es stringstream la mejor opción?
si tiene una matriz TCHAR o un puntero al comienzo de la misma, puede usar std::basic_istringstream
para trabajar con ella:
std::basic_istringstream<_TCHAR> ss(argv[x]);
int number;
ss >> number;
Ahora, number
es el número convertido. Esto funcionará en modo ANSI (_TCHAR está typedef''ed en char
) y en modo Unicode (_TCHAR es typedef`ed to wchar_t como dices).
Un TCHAR es un tipo de carácter que funciona tanto para ANSI como para Unicode. Mire en la documentación de MSDN (supongo que está en Windows), hay equivalentes de TCHAR para atoi y todas las funciones de cadena básicas (strcpy, strcmp, etc.)
El equivalente de TCHAR para atoi () es _ttoi (). Entonces podrías escribir esto:
int value = _ttoi(argv[1]);
Yo personalmente usaría stringstreams
, aquí hay un código para que comiences:
#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;
}
}
Seco codificado y no desarrollo en Windows, pero usando TCLAP
, esto debería hacerte correr con valores de argv
caracteres anchos:
#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;
}