¿Qué significa int argc, char * argv []?


En muchos IDE y compiladores de C++, cuando genera la función principal para usted, se ve así:

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

Cuando codifico C++ sin un IDE, solo con un compilador de línea de comandos, escribo:

int main()

Sin ningún parámetro. ¿Qué significa esto y es vital para mi programa?

Author: Rodrigo de Azevedo, 2010-06-11

8 answers

argv y argc son cómo se pasan los argumentos de la línea de comandos a main() en C y C++.

argc será el número de cadenas apuntadas por argv. Esto (en la práctica) será 1 más el número de argumentos, ya que prácticamente todas las implementaciones antepondrán el nombre del programa a la matriz.

Las variables se nombran argc (argumento count ) y argv (argumento vector ) por convención, pero se les puede dar cualquier identificador válido: int main(int num_args, char** arg_strings) es igualmente valido.

También se pueden omitir por completo, dando lugar a int main(), si no tiene la intención de procesar argumentos de línea de comandos.

Pruebe el siguiente programa:

#include <iostream>

int main(int argc, char** argv) {
    std::cout << "Have " << argc << " arguments:" << std::endl;
    for (int i = 0; i < argc; ++i) {
        std::cout << argv[i] << std::endl;
    }
}

Ejecutándolo con {[11] } producirá

Have 4 arguments:
./test
a1
b2
c3
 525
Author: meagar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-05 14:32:59

argc es el número de argumentos que se pasan a su programa desde la línea de comandos y argv es la matriz de argumentos.

Puede recorrer los argumentos conociendo el número de ellos como:

for(int i = 0; i < argc; i++)
{
    // argv[i] is the argument at index i
}
 45
Author: John Boker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-23 19:52:58

Supongamos que ejecuta su programa de esta manera (usando la sintaxis sh ):

myprog arg1 arg2 'arg 3'

Si declaraste tu main como int main(int argc, char *argv[]), entonces (en la mayoría de los entornos), tu main() se llamará como si fuera así:

p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));

Sin embargo, si declaraste tu main como int main(), se llamará algo así como

exit(main());

Y no se pasan los argumentos.

Dos cosas adicionales a tener en cuenta:

  1. Estas son las dos únicas firmas estándar para main. Si una plataforma en particular acepta argumentos adicionales o un tipo de retorno diferente, entonces eso es una extensión y no se debe confiar en un programa portátil.
  2. *argv[] y **argv son exactamente equivalentes, así que puedes escribir int main(int argc, char *argv[]) como int main(int argc, char **argv).
 14
Author: Toby Speight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-23 12:34:12

Los parámetros de main representan los parámetros de la línea de comandos proporcionados al programa cuando se inició. El parámetro argc representa el número de argumentos de la línea de comandos, y char *argv[] es una matriz de cadenas (punteros de caracteres) que representan los argumentos individuales proporcionados en la línea de comandos.

 7
Author: BlueMonkMN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-20 11:50:18

El primer parámetro es el número de argumentos proporcionados y el segundo parámetro es una lista de cadenas que representan esos argumentos.

 5
Author: Nick Gerakines,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-11 15:48:03

La función main puede tener dos parámetros, argc y argv. argc es un parámetro entero (int), y es el número de argumentos pasados al programa.

El nombre del programa es siempre el primer argumento, por lo que habrá al menos un argumento para un programa y el valor mínimo de argc será uno. Pero si un programa tiene dos argumentos, el valor de argc será tres.

El parámetro argvapunta a una matriz de cadenas y se denomina vector de argumento . Se es una matriz de cadena unidimensional de argumentos de función.

 5
Author: moshtagh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-20 11:51:49
int main();

Esta es una declaración simple. No puede aceptar ningún argumento de la línea de comandos.

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

Esta declaración se usa cuando su programa debe tomar argumentos de línea de comandos. Cuando se ejecuta como tal:

myprogram arg1 arg2 arg3

argc, or Argument Count, se establecerá en 4 (cuatro argumentos), y argv, or Argument Vectors, se rellenará con punteros de cadena a "myprogram", "arg1", "arg2" y "arg3". La invocación del programa (myprogram) se incluye en argumentos!

Alternativamente, puedes usar:

int main(int argc, char** argv);

Esto también es válido.

Hay otro parámetro que puede agregar:

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

El parámetro envp también contiene variables de entorno. Cada entrada sigue este formato:

VARIABLENAME=VariableValue

Así:

SHELL=/bin/bash    

La lista de variables de entorno termina en null.

IMPORTANTE: NO utilice ningún valor argv o envp directamente en las llamadas a system()! Esto es un enorme agujero de seguridad como los usuarios malintencionados podrían establecer variables de entorno a comandos de línea de comandos y (potencialmente) causar daños masivos. En general, simplemente no use system(). Casi siempre hay una mejor solución implementada a través de bibliotecas C.

 2
Author: Adrian Zhang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-05 05:50:28

Ambos de

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

Son definiciones legales del punto de entrada para un programa C o C++. Stroustrup: C++ Style and Technique FAQ detalla algunas de las variaciones que son posibles o legales para su función principal.

 1
Author: Chris Becke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-10 00:06:22