Argumentos a un programa c

Recordemos de UNIX, que llamamos argumentos de un comando o programa ejecutable a cualquier cadena de caracteres que se pone a la derecha del nombre del comando. Por ejemplo, en el comando cp fich1 fich2  los argumentos serán fich1 y fich2. El lenguaje C permite que se puedan introducir argumentos en línea de comandos, es decir, en el momento de la ejecución del programa. La declaración de estos argumentos se hace en la función main(), de la siguiente manera:

main( int argc, char *argv[])

El primer argumento se suele llamar argc, pero se le puede asignar cualquier otro nombre, y es un entero cuyo valor es el número de argumentos pasados al programa incluyendo como argumento el nombre del propio programa. Al segundo argumento se suele llamar argv, pero, como antes, se le puede asignar cualquier otro nombre. Este segundo argumento es un vector de punteros a carácter. Dejaremos para más adelante la explicación de este concepto, no fácil de entender por otro lado. Aquí vamos a considerar la variable argv como un array dobe a cadenas de caracteres, donde el primer índice apunta a cada cadena de caracteres introducida como argumento:

ejemplo:

argv[0]: almacena el nombre del programa.

argv[1]: almacena el primer argumento.

argv[2]: almacena el segundo argumento.

...

y el segundo índice apunta a cada caracter de la cadena correspondiente:

ejemplo:

argv[0][3]: cuarta letra (recordemos que los índices empiezan por 0) del nombre del programa.

argv[1][7]: octava letra del primer argumento.

argv[2][0]: primera letra del segundo argumento.

...

Ejemplo_Arr_6. Programa que muestra los argumentos pasados en línea de comandos

#include<stdio.h>

 

int main (int argc, char *argv[])

{

int i;

 

printf ("Número de argumentos pasados: %d\n",argc);

for (i= 0; i < argc; i++)

  {

  printf ("El argumento %d vale: %s\n",i, argv[i]);

  }

 

return 0;

}

 

Es importante tener en cuenta que todos los argumentos son pasados a main() como cadenas de caracteres. Es el programador el que tendrá que, usando las funciones adecuadas, pasar los datos de tipo cadena al tipo que desee. Una de estas funciones es, por ejemplo, sscanf().

Ejemplo_Arr_7. De cambio de tipo de un argumento a programa usando sscanf().

#include <stdio.h>

 

//Cambiamos de nombre a los parámetros a main

int main (int num_arg, char *arg[])

{

int arg2;

 

if ( sscanf(arg[2], "%d", &arg2) != 1)

  {

  fprintf(stderr,"*** ERROR en la lectura del segundo argumento. Valor leido: %s\n", arg[2]);

  exit(1);

  }

. . .

}

Responde a las siguientes preguntas:

  1. ¿Qué valor devuelve la función sscanf()?
  2. ¿Cómo funciona fprintf? ¿A qué salida se está mandando el mensaje de error, en caso de que se genere?

En la figura 1 se puede ver un ejemplo gráfico simplificado de la ubicación en memoria de los argumentos pasados a un programa: argv será la dirección de memoria del primer elemento del vector de punteros argv[], es decir, la dirección de memoria del elemento argv[0]; a su vez argv[0] apunta al primer elemento (carácter) de la cadena compuesta por el nombre del programa, es decir, argv[0] es a su vez un puntero a una cadena de caracteres. De igual manera se razona para argv[1] y argv[2] con respecto a las cadenas introducidas como primer y segundo argumento. Una conclusión de lo expuesto es que argv es un puntero a un puntero, y como tal puede ser tratado.

 

Fig 1.- Esquema simplificado del almacenamiento en memoria de los argumentos pasados a un programa en línea de comandos. Se supone que el programa ejecutado es: a.out uno 1. Esta figura muestra también la relación entre punteros y vectores con respecto a los argumentos a un programa.