Tengo un programa que toma varios argumentos de línea de comandos. En aras de la simplificación, diremos que tarda 3 banderas, -a
, -b
y -c
, y utilizar el siguiente código para analizar mis argumentos:getopt no puede detectar el argumento que falta para la opción
int c;
while((c = getopt(argc, argv, ":a:b:c")) != EOF)
{
switch (c)
{
case 'a':
cout << optarg << endl;
break;
case 'b':
cout << optarg << endl;
break;
case ':':
cerr << "Missing option." << endl;
exit(1);
break;
}
}
nota: unos, y los parámetros b tomar después de la bandera.
Pero me encuentro con un problema si invoco mi programa dicen con
./myprog -a -b parameterForB
donde me olvidó parameterForA, la parameterForA (representado por OPTARG) se devuelve como -b
y parameterForB se considera una opción sin parámetros y optind se establece en el índice de parameterForB en argv.
El comportamiento deseado en esta situación sería que ':'
se devuelve después de que ningún argumento se encuentra para -a
y Missing option.
se imprime en el error estándar. Sin embargo, eso solo ocurre en el caso de que -a
sea el último parámetro pasado al programa.
Supongo que la pregunta es: ¿hay alguna manera de hacer que getopt()
suponga que no habrá opciones con -
?
Esto tiene la ventaja añadida de permitir realmente argumentos que comienzan con '-' - simplemente no pueden ir precedidos de espacios en blanco. (por ejemplo, 'my_prog -x-a') – Potatoswatter