Argumentos en el Main
¿ Qué es y para que sirve ?
Cuando hablamos de “Argumentos a main” o “Argumentos en la línea de comandos” nos referimos a la capacidad de enviar parámetros de inicio a la ejecución de un programa. El objetivo de esta capacidad es poder hacer nuestros programas más versátiles, que sea posible establecer criterios de operación, archivos sobre los que trabajar, modalidades u opciones en general.
En nuestro caso utilizaremos la línea de comandos de nuestro sistema operativo o las facilidades de nuestro IDE de desarrollo para enviar información que condicione la ejecución del programa. Es importante aclarar que la funcionalidad no se circunscribe a este escenario, los argumentos al main son perfectamente válidos y útiles en una llamada entre programas.
En C, el primer paso para que nuestro programa acepte argumentos es, si nuestro entorno no lo hace automáticamente, declarar los parámetros en el main como indica en la siguiente imagen:

Los parámetros se denominan por convención argv y argc aunque esto no es obligatorio.
argc : Determina la cantidad de argumentos almacenados en argv, de esto deducimos que la cantidad de parámetros es variable.
argv : Es un array de punteros a cadenas de caracteres (Puedes encontrarlo declarado como char **argv), la cantidad de cadenas dependerá de los parámetros pasados al programa en su ejecución y argc nos ayuda a conocer este número.
Para que quede más claro, desarrollemos un programa, al que llamaremos “Copiador” que por ahora solo nos muestre los parámetros pasados a nuestra aplicación. La siguiente imagen nos da una aproximación al código:

El programa itera en un ciclo for, definido por argc y muestra todos los parámetros recibidos.
Para probar nuestro programa, nos posicionamos con el shell de línea de comandos de nuestro sistema operativo en la ubicación física del archivo ejecutable y procedemos a realizar la llamada como muestra la siguiente imagen:

Como se muestra en la imagen anterior, a pesar de escribir 2 parámetros (hola y pepe) el programa finalmente muestra 3 parámetros recibidos. Es claro que se agrega un parámetro más, y este parámetro es siempre el nombre (y en algunos casos la ruta completa) del archivo ejecutado.
Como habrás observado, puedes pasar tantos parámetros como quieras, los límites no están explícitamente definidos y dependen de la implementación particular del compilador y las limitaciones de plataforma, en cualquier caso, para aplicaciones prácticas encontraras que los limites exceden las necesidades.
Los parámetros pueden ser de cualquier tipo ya que en definitiva siempre serán una cadena de texto, la línea de comandos con argumentos al main de la imagen que se ve a continuación, está combinando enteros, flotantes y cadenas de texto.

Otro aspecto para tener en cuenta es la forma de operar cuando mi cadena de texto parámetro tiene espacios. Imaginemos que los archivos de la imagen anterior en realidad se llaman “archivo maestro.txt” y “archivo detalle.txt”. El espacio entre archivo y maestro o entre archivo y detalle generará parámetros adicionales, tomando a “archivo” como un parámetro y a “maestro.txt” como otro. Para evitar esta situación en la línea de comandos la cadena debe ser encerrada entre “”, en este caso será tomada como un único parámetro.

Aplicación Práctica
Para mostrar un caso de aplicación, si ya has cubierto las unidades de archivos, desarrollemos programa que copie archivos de manera binaria, el primer parámetro será el archivo origen, es decir el archivo a copiar y el segundo parámetro será el archivo destino, que en caso de existir será remplazado.

Para probar el ejemplo utilizaremos un archivo de imagen aqwa.jpg.Puedes conseguir tu propia imagen para realizar la prueba. Desde el modo comandos podemos hacer lo siguiente: El primer parametro es el exe, el segundo es la imagen y el tercero la que quiero crear.

Si utilizamos codeblocks, podemos ir a la solapa Project -> Set program’s arguments..


Otros entornos de desarrollo disfrutan de la misma característica. Si optas por esta opción y no envías una ruta absoluta del archivo debes tener en cuenta que el IDE forzara como carpeta actual a la carpeta del proyecto y no a la carpeta donde se encuentra el ejecutable.