sirve que por pasar parametros para metodo linea comandos comando argumentos c command-line-arguments getopt

c - que - pasar parametros al metodo main en java



¿Cómo tomar enteros como argumentos de línea de comando? (7)

He leído un ejemplo de getopt () pero no muestra cómo aceptar enteros como opciones de argumento, como cvalue estaría en el código del ejemplo:

#include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main (int argc, char **argv) { int aflag = 0; int bflag = 0; char *cvalue = NULL; int index; int c; opterr = 0; while ((c = getopt (argc, argv, "abc:")) != -1) switch (c) { case ''a'': aflag = 1; break; case ''b'': bflag = 1; break; case ''c'': cvalue = optarg; break; case ''?'': if (optopt == ''c'') fprintf (stderr, "Option -%c requires an argument./n", optopt); else if (isprint (optopt)) fprintf (stderr, "Unknown option `-%c''./n", optopt); else fprintf (stderr, "Unknown option character `//x%x''./n", optopt); return 1; default: abort (); } printf ("aflag = %d, bflag = %d, cvalue = %s/n", aflag, bflag, cvalue); for (index = optind; index < argc; index++) printf ("Non-option argument %s/n", argv[index]); return 0; }

Si ejecutara lo anterior como testop -c foo , cvalue sería foo , pero ¿y si quisiera testop -c 42 ? Ya que cvalue es de tipo char * , ¿podría simplemente lanzar optarg to (int) ? He intentado hacer esto sin usar getopt() y acceder a argv[whatever] directamente, y emitirlo como un entero, pero siempre termino con un número negativo grande cuando imprimo con %d . Supongo que no estoy desreferente argv[] correctamente o algo así, no estoy seguro ...


Como ya ha utilizado en su código, el prototipo para la función main es

int main (int argc, char** argv)

Cualesquiera que sean los argumentos proporcionados como argumentos de línea de comando, se pasan a su ''programa'' como una matriz de caracteres * (o simplemente cadenas). por lo tanto, si invoca un prog como foo.exe 123 , el primer argumento de foo.exe será una cadena 123 y no un valor entero de 123.

Si intenta convertir el argumento en entero (como usted dijo) probablemente usando algo como: (int) argv[1] , no obtendrá el valor entero del primer argumento, sino alguna dirección de memoria donde se almacena el primer argumento en su espacio de dirección. Para obtener un valor entero, debe convertir explícitamente el valor de cadena a un valor entero. Para esto, puedes usar la función atoi . Verifique en THIS página de manual las funciones similares que se pueden usar para la conversión.


En esta situación me gustaría ir por un sscanf() .


No, no puede simplemente convertir para convertirlo en un valor entero. Necesita transformarlo usando sscanf, atoi, atol o una función similar.


Todas las respuestas anteriores son en general correctas (Vikram.exe recibe sugerencias para explicar por qué debe llamar a una función de biblioteca, lo que nadie más se molestó en hacer). Sin embargo, nadie ha nombrado la función de biblioteca correcta para llamar. No utilice atoi . No utilice sscanf .

Use strtol , o su strtoul relativo si no quiere permitir números negativos. Solo estas funciones le brindan suficiente información cuando la entrada no era un número. Por ejemplo, si el usuario escribe

./a.out 123cheesesandwich

atoi y sscanf devolverán alegremente 123, lo cual es casi seguro que no es lo que quieres. Solo strtol le dirá (a través de endptr ) que procesó solo los primeros caracteres de la cadena.

(No hay strtoi , pero sí hay strtod si necesita leer un número de coma flotante).


Utilice atoi .

cvalue = atoi( optarg );

Y declarar cvalue como un int .


atoi() , que significa que ascii to integer es la función a utilizar. De manera similar, atof() se puede usar para obtener valores flotantes.


atoi() usar atoi() para convertir de cadena a entero.