• Lunes 16 de Diciembre de 2024, 09:48

Autor Tema:  Re: Lectura De Parametros De Entrda  (Leído 1376 veces)

Fernando_P

  • Miembro activo
  • **
  • Mensajes: 88
    • Ver Perfil
Re: Lectura De Parametros De Entrda
« en: Lunes 2 de Mayo de 2005, 21:32 »
0
Hola,
necesito saber como manejar en C los parametros externos de la llamada a un programa.

ejplo:

la llamada es

prog1 -ujperez/jperez -i1234 archivo

prog1= nom de la app.
-ujperez/jperez =usuario/passwd de la BD
-i1234 =numkero que debo rescatar de esta llamada
archivo= archivo con datos de entrada al prgrama.

Ocupando la funcion getopt() el programa se queda pegado y me genera un core(Lo estoy corriendo en unix). me interesa rescatar el entero despues de -i y el nombre del archivo, el usuario es necesario para la conexion a la BD.

Tengo problemas con la lectura de la seccion -in°

Espero puedan ayudarme, es urgente!!!

Gracias.

Fernando

pitukilloloco

  • Miembro MUY activo
  • ***
  • Mensajes: 104
    • Ver Perfil
Re: Lectura De Parametros De Entrda
« Respuesta #1 en: Martes 3 de Mayo de 2005, 00:01 »
0
Te dejo un extracto del excelente libro El Lenguaje de Programación C de Brian W. Kernighan y Dennis M. Ritchie (los creadores del lenguaje) traducido de la segunda edición en inglés. Esta es una edición en español de 1991 editada por Prentice-Hall Hispanoamericana, S. A. Lo dicho ahí funciona para cualquier compilador de C/C++, no importando el sistema operativo en que lo estés usando. Espero que te sirva.

5.10 Argumentos en la línea de órdenes
   Dentro de un medio ambiente que maneje C hay una forma de pasar argumentos en la línea de órdenes o de parámetros a un programa cuando empieza su ejecución. Cuando se llama a main se le invoca con dos argumentos. El primero, llamado por convención argc (por "argument count") es el número de argumentos en la línea de órdenes con los que se invocó el programa; el segundo argv (por "argument vector") es un apuntador a un arreglo de cadenas de caracteres que contiene los argumentos, uno por cadena. Se acostumbra a utilizar niveles múltiples de apuntadores para manipular esas cadenas de caracteres.
   El ejemplo más sencillo es el programa echo, que despliega sus argumentos de la línea de órdenes en una línea, separados por blancos. Esto es, la orden
echo hola, mundo
imprime
hola, mundo
   Por convención, argv[0] es el nombre con el que se invocó el programa, por lo que argc es por lo menos 1. Si argc es 1, entonces no hay argumentos en la línea después del nombre del programa. En el ejemplo anterior, argc es 3, y argv[0], argv [1] y argv[2] son echo, hola y mundo, respectivamente. El primer argumento optativo es argv[1] y el último es argv[argc-1]; además, el estándar requiere que argv[argc] sea un apuntador nulo
La primera versión de echo trata a argv como un arreglo de apuntadores a caracteres:
Código: Text
  1.  
  2. #include <stdio.h>
  3. /* eco de los argumentos de la línea de órdenes; 1a. versión */
  4. main (int argc, char *argv[])
  5. {
  6.   int i;
  7.  
  8.   for (i = 1; 1 < argc; i++)
  9.     printf ("%s%s", argv[i], (i < argv-1) ? " ": "");
  10.   printf ("\n")
  11.   return 0;
  12. }
  13.  
  14.  
Como argv es un apuntador a un arreglo de apuntadores, se pueden manipular al apuntador en lugar de indexar al arreglo. Esta siguiente variación se basa en incrementar argv, que es un apuntador a un apuntador a char, en tanto se disminuye argc:
Código: Text
  1.  
  2. #include <stdio.h>
  3.  
  4. /* eco de los argumentos de la línea de órdenes; 2a. versión */
  5. main (int argc, char *argv[])
  6. {
  7.   while (--argc > 0)
  8.     printf ("%s%s", *++argv, (argc > 1) ? " ": "");
  9.   printf ("\n");
  10.   return 0;
  11. }
  12.  
  13.  
Puesto que argv es un apuntador al inicio del arreglo de cadenas de argumentos, incrementarlo en 1 (++argv) lo hace apuntar hacia argv[1] en lugar de apuntar a argv[0]. Cada incremento sucesivo lo mueve al siguiente argumento; entonces *argv es el apuntador a ese argumento. Al mismo tiempo, argc disminuye; cuando llega a cero, no quedan argumentos por imprimir.
   En forma alternativa, podemos escribir la proposición printf como
   printf ((argc > 1) ? "%s" : "%s", *++argv);
Esto demuestra que el argumento de formato de printf también puede ser una expresión.

extremet

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Lectura De Parametros De Entrda
« Respuesta #2 en: Viernes 1 de Julio de 2005, 00:20 »
0
Si declaras el main de la forma  int main (int arc, char** argv)

podrás usar las variables argv[0], argv[1], etc.. que son cadenas que contienen los parámetros pasados al ejecutable. En tu caso, si el parámetro -inum es el segundo, lo tendrías en argv[2]. Es decir, argv[2] valdrá "-inum".

Ahora bien, si a tí lo que te interesa es el número, tendrás que hacer una conversión con la función int atoi(char*), que pasándole una cadena te devuelve el número entero representado. Sin embargo, como el número no empieza al principio, sino que antes tienes que comerte el "-" y la "i", puedes hacer lo siguiente:

 valor = atoi ((argv[2]+2))

Esto del argv[2]+2 parece algo raro... Hay que tener en cuenta que para C, el argv[2] solamente es un puntero al inicio de la cadena de caracteres. Como puntero, puedes incrementar su posición, de modo que así apuntara al inicio de la cadena más dos posiciones, es decir, leerá a partir del número.

Y ya está. Espero que te sirva.