2010-06-11 37 views
348

En muchos C++ IDE y compiladores, cuando se genera la función principal para usted, que se parece a esto:¿Qué significa int argc, char * argv []?

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

Cuando el código C++ y sin un IDE, sólo con un compilador de línea de comandos, tipo I:

int main() 

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

+35

Si su programa va a ignorar los argumentos de la línea de comandos, entonces lo que escriba está bien. Si su programa necesita procesar argumentos de línea de comando, entonces el IDE lo está haciendo bien. –

+17

Una pista para los piratas informáticos: intente declarar 'int main (int argc, char * argv [], char * envp [])' e imprima el último argumento. ';)' – ulidtko

+4

@ulidtko no es bueno que estés enseñando a los novatos a introducir vulnerabilidad en sus programas;) –

Respuesta

476

argv y argc son como los argumentos de la línea de comando pasan 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 anteponerán el nombre del programa a la matriz.

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

También se pueden omitir por completo, produciendo int main(), si no tiene la intención de procesar los argumentos de la 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; 
    } 
} 

Correr con salida ./test a1 b2 c3 voluntad

Have 4 arguments: 
./test 
a1 
b2 
c3 
+7

'argc' puede ser 0, en cuyo caso' argv' puede ser NULL. Está permitido por el estándar AFAIK. Nunca he oído hablar de un sistema que haga esto en la práctica, pero ciertamente podría existir y no estaría violando ningún estándar. – Chuck

+63

@Chuck: Dado que "El valor de' argv [argc] 'será 0" (C++ 03 §3.6.1/2), 'argv' no puede ser nulo. –

+0

@James: Ah, buen punto. Estaba pensando en C, que tiene reglas sutilmente diferentes para 'main'. – Chuck

42

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

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

for(int i = 0; i < argc; i++) 
{ 
    // argv[i] is the argument at index i 
} 
7

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

+2

Argv [] siempre tiene argv [arg] como un puntero nulo. y Argv [0] es siempre el (camino completo)/executableName como una cadena terminada en nulo – user3629249

+2

@ user3629249: No necesariamente; 'argv [0]' es lo que el programa que lanzó el programa C le dio como 'argv [0] '. En el caso de Bash, a menudo (tal vez siempre) es la ruta del ejecutable, pero Bash no es el único programa que ejecuta otros programas. Es permisible, aunque excéntrico, usar: 'char * args [] = {" cat ","/dev/null ","/etc/passwd ", 0}; execv ("/ bin/ls", args); '. En muchos sistemas, el valor visto por el programa como 'argv [0]' será 'cat', aunque el ejecutable sea'/bin/ls'. –

5

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

la primera entrada en argv [0] es el nombre del programa, no es un argumento – user3629249

1

Ambos

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

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

+2

Puede que quiera poner el vacío en ... 'int main()' ==> 'int main (void)' ... para compatibilidad y legibilidad . No sé si todas las versiones anteriores de C permiten que las funciones vacías tengan una lista de parámetros vacía en la declaración. – dylnmc

+1

@dylnmc esto no da ninguna ganancia de legibilidad, y es exactamente equivalente en todas las versiones de C++. Solo en C esto tiene una diferencia, pero solo en declaraciones, no en definición. – Ruslan

+0

@Ruslan Lo siento, publiqué esto cuando recién estaba aprendiendo C, y podría haber leído que en versiones muy antiguas de C se requiere 'void'. No me cites sobre eso, y ahora sé que es un comentario un poco tonto. Sin embargo, no puede doler. – dylnmc

5

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

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

Parámetro argv apunta a una matriz de cadenas y se llama el "vector de argumento". Es una matriz de cadena unidimensional de argumentos de función.

+1

también será útil: http://crasseux.com/books/ctutorial/argc-and-argv.html – moshtagh

11

suponga que ejecuta su programa de este modo (usando sh sintaxis):

myprog arg1 arg2 'arg 3' 

Si usted declaró que su principal como int main(int argc, char *argv[]), entonces (en la mayoría de los ambientes), su main() se llamará como si como:

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

Sin embargo, si usted declaró que su principal como int main(), que se llamará algo así como

exit(main()); 

y no obtiene los argumentos pasados.

dos cosas adicionales a tener en cuenta:

  1. Estas son las dos únicas firmas con mandato estándar para main. Si una plataforma en particular acepta argumentos adicionales o un tipo de devolución diferente, entonces esa es una extensión y no se debe confiar en ella en un programa portátil.
  2. *argv[] y **argv son exactamente equivalentes, por lo que puede escribir int main(int argc, char *argv[]) como int main(int argc, char **argv).
+1

Si estamos siendo técnicos, ['basic.start.main/2'] (https://timsong-cpp.github.io/cppwp/basic.start.main#2) permite explícitamente versiones adicionales definidas por la implementación de 'main()', siempre que la implementación proporcione las dos versiones predefinidas. Por lo tanto, no son _exactamente_ no conformes. El más común es 'envp', que es tan conocido en C y C++ que [es literalmente la primera entrada en la sección J.5 (Extensiones comunes) del estándar C] (http://port70.net) /~nsz/c/c11/n1570.html#J.5). –

+0

Gracias por la buena pedantería @Justin. Respuesta actualizada para ser más correcta. –

+0

@TobySpeight \t ¿qué pasa si argc <3 devuelve un error? ¿Qué podría salir mal? – AVI

1
int main(); 

Ésta es una simple declaración. No puede tomar ningún argumento de línea de comando.

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

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

myprogram arg1 arg2 arg3 

argc, o número de argumentos, se establece en 4 (cuatro argumentos), y argv, o vectores de argumentos, se rellenará con punteros de cadena a "myprogram", "arg1", "arg2" y "arg3". ¡La invocación del programa (myprogram) está incluida en los argumentos!

Como alternativa, puede utilizar:

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 tiene este formato:

VARIABLENAME=VariableValue 

así:

SHELL=/bin/bash  

El entorno de la lista de variables es terminada en nulo.