¿Cómo convertir un argumento de línea de comando a int?

Necesito obtener un argumento y convertirlo a un int. Aquí está mi código hasta ahora:

#include  using namespace std; int main(int argc,int argvx[]) { int i=1; int answer = 23; int temp; // decode arguments if(argc < 2) { printf("You must provide at least one argument\n"); exit(0); } // Convert it to an int here } 

Dado que esta respuesta fue aceptada de alguna manera y, por lo tanto, aparecerá en la parte superior, aunque no es la mejor, la he mejorado en función de las otras respuestas y los comentarios.

La forma C; más simple, pero tratará cualquier número inválido como 0:

 #include  int x = atoi(argv[1]); 

La forma C con comprobación de entrada:

 #include  errno = 0; char *endptr; long int x = strtol(argv[1], &endptr, 10); if (endptr == argv[1]) { std::cerr << "Invalid number: " << argv[1] << '\n'; } else if (*endptr) { std::cerr << "Trailing characters after number: " << argv[1] << '\n'; } else if (errno == ERANGE) { std::cerr << "Number out of range: " << argv[1] << '\n'; } 

El modo C ++ iostreams con comprobación de entrada:

 #include  std::istringstream ss(argv[1]); int x; if (!(ss >> x)) { std::cerr << "Invalid number: " << argv[1] << '\n'; } else if (!ss.eof()) { std::cerr << "Trailing characters after number: " << argv[1] << '\n'; } 

Vía C ++ alternativa desde C ++ 11:

 #include  #include  std::string arg = argv[1]; try { std::size_t pos; int x = std::stoi(arg, &pos); if (pos < arg.size()) { std::cerr << "Trailing characters after number: " << arg << '\n'; } } catch (std::invalid_argument const &ex) { std::cerr << "Invalid number: " << arg << '\n'; } catch (std::out_of_range const &ex) { std::cerr << "Number out of range: " << arg << '\n'; } 

Las cuatro variantes asumen que argc >= 2 . Todos aceptan espacios en blanco principales; comprueba isspace(argv[1][0]) si no quieres eso. Todos excepto atoi rechazan los espacios en blanco.

Tenga en cuenta que sus argumentos main no son correctos. El formulario estándar debe ser:

 int main(int argc, char *argv[]) 

o equivalente:

 int main(int argc, char **argv) 

Hay muchas formas de lograr la conversión. Este es un enfoque:

 #include  int main(int argc, char *argv[]) { if (argc >= 2) { std::istringstream iss( argv[1] ); int val; if (iss >> val) { // Conversion successful } } return 0; } 

std :: stoi from string también podría ser utilizado.

  #include  using namespace std; int main (int argc, char** argv) { if (argc >= 2) { int val = stoi(argv[1]); // ... } return 0; } 

Como WhirlWind ha señalado, las recomendaciones para usar atoi no son realmente muy buenas. atoi no tiene manera de indicar un error, por lo que obtiene el mismo retorno de atoi("0"); como lo haces desde atoi("abc"); . El primero es claramente significativo, pero el segundo es un claro error.

También recomendó strtol , que está perfectamente bien, aunque un poco torpe. Otra posibilidad sería usar sscanf , algo así como:

 if (1==sscanf(argv[1], "%d", &temp)) // successful conversion else // couldn't convert input 

tenga en cuenta que strtol proporciona resultados ligeramente más detallados, en particular, si tiene un argumento como 123abc , la llamada a sscanf simplemente diría que ha convertido un número (123), mientras que strtol no solo le informará que ha convertido el número , pero también un puntero al a (es decir, el comienzo de la parte que no podría convertirse en un número).

Como está usando C ++, también podría considerar usar boost::lexical_cast . Esto es casi tan fácil de usar como atoi , pero también proporciona (más o menos) el mismo nivel de detalle en los errores de notificación que strtol . El mayor gasto es que puede arrojar excepciones, por lo tanto, para usarlo, su código debe ser a prueba de excepciones. Si estás escribiendo C ++, deberías hacer eso de todos modos, pero de algún modo fuerza el problema.

Eche un vistazo a strtol (), si usa la biblioteca estándar C.

El enfoque con istringstream se puede mejorar para comprobar que no se hayan insertado otros caracteres después del argumento esperado:

 #include  int main(int argc, char *argv[]) { if (argc >= 2) { std::istringstream iss( argv[1] ); int val; if ((iss >> val) && iss.eof()) // Check eofbit { // Conversion successful } } return 0; } 

Así podemos hacer …

 int main(int argc, char *argv[]) { int a, b, c; *// Converting string type to integer type // using function "atoi( argument)"* a = atoi(argv[1]); b = atoi(argv[2]); c = atoi(argv[3]); } 
Intereting Posts