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.