O que significa em argc, char * argv []?

em muitos IDE e compiladores de C++, quando gera a função principal para si, parece-se com isto:

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

Quando codifico C++ sem um IDE, apenas com um compilador de linha de comandos, eu digito:

int main()

sem quaisquer parâmetros. O que isso significa, e é vital para o meu programa?

Author: Rodrigo de Azevedo, 2010-06-11

8 answers

argv e argc são como os argumentos da linha de comandos são passados para main() em C e c++.

argc será o número de cadeias apontadas por argv. Isto será (na prática) 1 Mais o número de argumentos, como virtualmente todas as implementações irão preparar o nome do programa para o array.

As variáveis são nomeados argc (contagem de argumento) e argv (argumento vetor) por convenção, mas que pode ser dada qualquer identificador válido: int main(int num_args, char** arg_strings) é igualmente valido.

Eles também podem ser omitidos inteiramente, rendendo int main(), Se você não pretende processar argumentos da linha de comandos.

Tente o seguinte 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;
    }
}

Executá - lo com ./test a1 b2 c3 irá produzir

Have 4 arguments:
./test
a1
b2
c3
 525
Author: meagar, 2011-07-05 14:32:59

argc é o número de argumentos que estão a ser passados para o seu programa a partir da linha de comandos e argv é a lista de argumentos.

Podes ler os argumentos sabendo o número deles como:

for(int i = 0; i < argc; i++)
{
    // argv[i] is the argument at index i
}
 45
Author: John Boker, 2016-08-23 19:52:58

Suponha que executa o seu programa assim (usando a sintaxe sh):

myprog arg1 arg2 'arg 3'

Se declarou o seu principal como int main(int argc, char *argv[]), então (na maioria dos ambientes), o seu main() será chamado como se fosse:

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

No entanto, se declarares o teu principal como int main(), chamar-se-á algo como

exit(main());
E tu não fazes passar os argumentos.

Duas coisas adicionais para anotar:

  1. estas são as duas únicas assinaturas mandatadas para main. Se um determinado a plataforma aceita argumentos extras ou um tipo de retorno diferente, então isso é uma extensão e não deve ser invocado em um programa portátil.
  2. *argv[] e {[9] } são exatamente equivalentes, então você pode escrever int main(int argc, char *argv[]) como int main(int argc, char **argv).
 14
Author: Toby Speight, 2017-01-23 12:34:12

Os parâmetros de main representam os parâmetros da linha de comandos fornecidos ao programa quando este foi iniciado. O parâmetro argc representa o número de argumentos da linha de comandos, e char *argv[] é uma lista de strings (ponteiros de caracteres) que representam os argumentos individuais fornecidos na linha de comandos.

 7
Author: BlueMonkMN, 2018-04-20 11:50:18

O primeiro parâmetro é o número de argumentos fornecidos e o segundo parâmetro é uma lista de strings que representam esses argumentos.

 5
Author: Nick Gerakines, 2010-06-11 15:48:03

A função main pode ter dois parâmetros, argc e argv. argc é um parâmetro inteiro (int), e é o número de argumentos passados ao programa.

O nome do programa é sempre o primeiro argumento, por isso haverá pelo menos um argumento para um programa e o valor mínimo de argc será um. Mas se um programa tem dois argumentos, o valor de argc será três.

O parâmetro argv aponta para um array de texto e é chamado de argumento vector. É um array de cadeia unidimensional de argumentos de função.

 5
Author: moshtagh, 2018-04-20 11:51:49
int main();
Esta é uma declaração simples. Não pode aceitar quaisquer argumentos da linha de comandos.
int main(int argc, char* argv[]);

Esta declaração é usada quando o seu programa tem de aceitar os argumentos da linha de comandos. Quando correr assim:

myprogram arg1 arg2 arg3

argc, or Argument Count, will be set to 4( four arguments), and argv, or Argument Vetors, will be populated with string pointers to "myprogram", "arg1", "arg2", and "arg3". a invocação do programa (myprogram) está incluída na argumentos!

Em alternativa, pode usar:

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

Isto também é válido.

Há outro parâmetro que pode adicionar:

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

O parâmetro envp também contém variáveis de ambiente. Cada entrada segue Este formato:

VARIABLENAME=VariableValue
Assim:
SHELL=/bin/bash    

A lista de variáveis de ambiente é nula.

Importante: Não utilize nenhum valor argv ou envp directamente nas chamadas para system()! Isto é um enorme buraco de segurança como usuários maliciosos poderiam definir variáveis de ambiente para comandos de linha de comando e (potencialmente) causar danos massivos. Em geral, apenas não use system(). Há quase sempre uma solução melhor implementada através de bibliotecas C.

 2
Author: Adrian Zhang, 2018-04-05 05:50:28

Ambos de

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

São definições legais do ponto de entrada para um programa C ou C++. Stroustrup: FAQ de estilo e técnica C++ detalha algumas das variações que são possíveis ou legais para a sua função principal.

 1
Author: Chris Becke, 2013-09-10 00:06:22