Argumentos para main em C

Eu não sei o que fazer! Eu tenho uma grande compreensão do básico de C. Estruturas, arquivos IO, strings, etc. Tudo menos CLA. Por alguma razão eu não consigo entender o conceito. Qualquer sugestão, ajuda ou conselho. PS Eu sou um usuário linux

A assinatura do main é:

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

argc refere-se ao número de argumentos da linha de comandos transmitidos, o que inclui o nome real do programa, conforme invocado pelo usuário. argv contém os argumentos reais, começando pelo índice 1. O índice 0 é o nome do programa.

Então, se você rodou seu programa assim:

 ./program hello world 

Então:

  • argc seria 3.
  • argv [0] seria “./program”.
  • argv [1] seria “olá”.
  • argv [2] seria “mundo”.

Para analisar argumentos de linha de comando em sistemas posix, o padrão é usar a família getopt() de rotinas de biblioteca para manipular argumentos de linha de comando.

Uma boa referência é o manual GNU getopt

Imagine assim

 *main() is also a function which is called by something else (like another FunctioN) *the arguments to it is decided by the FunctioN *the second argument is an array of strings *the first argument is a number representing the number of strings *do something with the strings 

Talvez um programa de exemplo ajudasse.

 int main(int argc,char *argv[]) { printf("you entered in reverse order:\n"); while(argc--) { printf("%s\n",argv[argc]); } return 0; } 

Ele apenas imprime tudo que você insere como argumentos na ordem inversa, mas você deve fazer novos programas que façam algo mais útil.

compilá-lo (como dizer Olá) executá-lo a partir do terminal com os argumentos como

 ./hello am i here 

em seguida, tente modificá-lo para que ele tente verificar se duas strings são reversas uma da outra ou não, então você precisará verificar se o parâmetro argc é exatamente três se alguma coisa imprimir um erro

 if(argc!=3)/*3 because even the executables name string is on argc*/ { printf("unexpected number of arguments\n"); return -1; } 

então verifique se argv [2] é o reverso de argv [1] e imprima o resultado

 ./hello asdf fdsa 

deve sair

 they are exact reverses of each other 

o melhor exemplo é um programa de cópia de arquivos tente é como cp

cp arquivo1 arquivo2

cp é o primeiro argumento (argv [0] não argv [1]) e principalmente você deve ignorar o primeiro argumento a menos que você precise referenciar ou algo

se você fez o programa cp você entendeu os argumentos principais realmente …

Siamore, eu continuo vendo todo mundo usando a linha de comando para compilar programas. Eu uso o terminal x11 do ide via code :: blocks, um compilador gnu gcc na minha checkbox linux. Eu nunca compilei um programa a partir da linha de comando. Então, Siamore, se eu quiser que o nome do programa seja cp, eu inicializo o argv [0] = “cp”; Cp sendo uma string literal. E qualquer coisa que vai para stdout vai na linha de comando ??? O exemplo que você me deu Siamore eu entendi! Mesmo que a string que você digitou tenha algumas palavras, ainda era apenas uma arg. Porque foi encapsulado em duplas citações. Então arg [0], o nome prog, é na verdade sua string literal com um novo caractere de linha ?? Então eu entendo porque você usa if (argc! = 3) erro de impressão. Porque o nome prog = argv [0] e há mais 2 args depois disso, e mais um erro ocorreu. Que outra razão eu usaria isso? Eu realmente acho que a minha falta de compreensão sobre como compilar a partir da linha de comando ou terminal é a minha razão para a falta de compreensão nesta área! Siamore, você me ajudou a entender muito melhor a cla! Ainda não entendo completamente, mas não estou alheio ao conceito. Eu vou aprender a compilar a partir do terminal e reler o que você escreveu. Aposto, então vou entender completamente! Com um pouco mais de ajuda de você lol

<> Código que eu não escrevi eu mesmo, mas do meu livro.

 #include  int main(int argc, char *argv[]) { int i; printf("The following arguments were passed to main(): "); for(i=1; i 

Esta é a saída:

 anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hey man The follow arguments were passed to main(): hey man anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hi how are you doing? The follow arguments were passed to main(): hi how are you doing? 

Então argv é uma tabela de literais de string, e argc é o número deles. Agora argv [0] é o nome do programa. Então, se eu digitar ./CLA para executar o programa ./CLA é argv [0]. O programa acima define a linha de comando para obter uma quantidade infinita de argumentos. Eu posso configurá-los para levar apenas 3 ou 4 se eu quisesse. Como um ou seus exemplos mostraram, Siamore ... if (argc! = 3) printf ("Algum erro vai aqui"); Obrigado Siamore, não poderia ter feito isso sem você! graças ao resto do post pelo seu tempo e esforço também!

PS no caso há um problema como este no futuro ... você nunca sabe lol o problema foi porque eu estava usando o IDE AKA Code :: Blocks. Se eu fosse executar esse programa acima, ele imprimia o caminho / diretório do programa. Exemplo: ~ / Documents / C / CLA.c ele deve ser executado a partir do terminal e compilado usando a linha de comando. gcc -o CLA main.c e você deve estar no diretório do arquivo.

Main é como qualquer outra function e argc e argv são como qualquer outro argumento de function, a diferença é que main é chamado de C Runtime e passa o argumento para main, mas C Runtime é definido na biblioteca c e você não pode modificá-lo Então, se executarmos um programa no shell ou através de algum IDE, precisamos de um mecanismo para passar o argumento para a function principal, de modo que sua function principal possa se comportar de maneira diferente no tempo de execução, dependendo de seus parâmetros. Os parâmetros são argc, que fornece o número de argumentos e argv que é o ponteiro para a matriz de pointers, que contém o valor como strings, dessa forma você pode passar qualquer número de argumentos sem restringi-lo, é a outra maneira de implementar var args.

Fizera apenas uma pequena alteração no código @anthony para que pudéssemos obter uma saída bem formatada com números e valores de argumentos. De alguma forma, mais fácil de ler na saída quando você tem vários argumentos:

 #include  int main(int argc, char *argv[]) { printf("The following arguments were passed to main():\n"); printf("argnum \t value \n"); for (int i = 0; i 

E a saída é semelhante a:

 The following arguments were passed to main(): 0 D:\Projects\test\vcpp\bcppcomp1\Debug\bcppcomp.exe 1 -P 2 TestHostAttoshiba 3 _http._tcp 4 local 5 80 6 MyNewArgument 7 200.124.211.235 8 type=NewHost 9 test=yes 10 result=output