/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

deteccion de opciones desde linea de comandos

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
aLiSH



Registrado: 26 Oct 2007
Mensajes: 6

MensajePublicado: 14/11/2007 3:10 am
Título: deteccion de opciones desde linea de comandos

Hola a todos,

Me gustaría saber cómo se podría hacer para que un programa ejecutado desde el terminal detecte varias opciones que el usuario ponga en la linea de comandos. He mirado algo sobre las flags pero no creo que sea exactamente lo que busco. Hay algúm método o funcion estandarizado? o tengo que ir poniendo ifs para cada elemento en argv??

Por ejemplo: > ./mi_programa -i valor_i -j valor_j
Y luego el programa según los valores de i,j haga unas cosas u otras.

No se si me expliqué bien. Muchas gracias por la ayuda.
Volver arriba
Killrazor



Registrado: 24 Ene 2006
Mensajes: 1182
Ubicación: Barcelona

MensajePublicado: 14/11/2007 4:16 am
Título:

Código:
#include <stdio.h>
int main( int argc, const char* argv[] )
{
   // Prints each argument on the command line.
   for( int i = 0; i < argc; i++ )
   {
      printf( "arg %d: %s\n", i, argv[i] );
   }
}


int argc es el numero de parametros que lee en la linea de comandos, const char* argv[] es un array con estos argumentos en forma de texto que deberas transformar tu apropiadamente. El programa en cuestion que he puesto de ejemplo escribe por pantalla los argumentos que has puesto en linea de comandos.
_________________
I wanna heal i wanna feel like I'm close to something real.
I wanna find something I've wanted all along
somewhere i belong
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3770
Ubicación: Mexico

MensajePublicado: 14/11/2007 7:11 am
Título:

Cuando se define la funcion main de esta forma:
Código:
int main(int argc, char **argv){ ... }


argc indica el numero de argumentos pasados mediante la linea de comandos incluyendo el nombre de la aplicacion.

argv es un puntero al bloque donde se almacenan las direcciones (tipo "char *") de cada uno de los argumentos en la forma de cadenas:

1) argv[0] apunta al primer argumento que, de estar disponible (lo usual), es el nombre de la aplicacion y en caso contrario es NULL.

2) Los elementos restantes en el rango 1 a argc son los argumentos pasados mediante la linea de comandos: argv[1] apunta al primer argumento, argv[2] apunta al segundo argumento, etc.

3) El valor almacenado en argv[argc] siempre es NULL.

Un programa sencillo (C estandar) que muestra como procesar la linea de comandos es:
Código:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{   
   int i;
   char **p;
   
   puts("Lista de argumentos (1):");
   for (i = 0; i <= argc; i++)
      printf(
         "argv[%d] == \"%s\"\n",
         i,
         argv[i] != NULL ? argv[i] : "NULL"
      );
   
   puts("----");
   
   puts("Lista de argumentos (2):");
   for (p = argv; p <= argv + argc; p++)
      printf(
         "argv[%ld] == \"%s\"\n",
         (long int) (p - argv),
         *p != NULL ? *p : "NULL"
      );
   
   return EXIT_SUCCESS;
}


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
aLiSH



Registrado: 26 Oct 2007
Mensajes: 6

MensajePublicado: 15/11/2007 4:05 am
Título:

Muchas gracias por las ideas. He probado esto y me sale un error:

Código:
   
for(int i = 0; i < argc; i++) {
  printf("arg %d: %s\n", i, argv[i]);
  // check arguments
  if(*argv[1]=='-help') {
    cerr << ":: USAGE ::" << endl;
  }
}


El error no me deja compilar y dice:

aviso: constante de carácter demasiado grande para su tipo
aviso: la comparación siempre es falsa debido al rango limitado del tipo de datos

Que estoy poniendo mal?? muchas gracias por adelantado. Un saludo.
Volver arriba
aLiSH



Registrado: 26 Oct 2007
Mensajes: 6

MensajePublicado: 15/11/2007 6:48 am
Título:

Vale, lo solucioné con:

Código:
     
for(int i = 0; i < argc; i++) {
  if (strcmp(argv[i],"-help")==0) {
    cout << "tiene help" << endl;
  }
}
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com