paulo1205
(usa Ubuntu)
Enviado em 19/02/2018 - 23:16h
Os argumentos já estão num array:
argv trabalha como um array de ponteiros para caracteres, cada um deles contendo uma string correspondente a um argumento, dispostos na mesma ordem em que foram digitados (incluindo o nome usado para invocar o programa). E a quantidade de elementos do array (ou seja: a quantidade de argumentos) é dado pelo valor inteiro
argc.
Suponha que você tem o seguinte programa.
#include <iostream>
int main(int argc, char **argv){
std::cout << "Quantidade de argumentos: argc=" << argc << '\n';
for(int n=0; n<argc; n++)
std::cout << "argv[" << n << "]=\"" << argv[n] << "\"\n";
// O array tem, na verdade, um elemento a mais do que o valor de argc:
// um ponteiro nulo, que é uma outra forma de identificar que se chegou
// ao final dos argumentos armazenados em argv. Esse ponteiro nulo
// será indicado na saída do programa como um valor zero (note que não
// está entre aspas).
std::cout << "argv[" << argc << "]=" << static_cast<void *>(argv[argc]) << "\n";
}
Se você compilar esse programa chamando-o de
teste1, e executá-lo com a linha mostrada abaixo, a saída será a que é mostrada logo em seguida.
./teste1 um 2 "tres, meu amigo" 4
Quantidade de argumentos: argc=5
argv[0]="./teste1"
argv[1]="um"
argv[2]="2"
argv[3]="tres, meu amigo"
argv[4]="4"
argv[5]=0
Por outro lado, se você executar o programa sem passar nenhum argumento extra,
argv ainda conterá pelo menos o nome do programa, e isso se refletirá também em
argc.
./teste1
Quantidade de argumentos: argc=1
argv[0]="./teste1"
argv[1]=0
-----------
Nota 1: Algumas pessoas preferem escrever “
int main(int argc, char *argv[])”, por achar que os colchetes deixam mais evidente que
argv contém um array, e não é um ponteiro genérico qualquer. Do ponto de vista do C ou do C++, as duas notações são absolutamente sinônimas, e caracterizam um ponteiro para ponteiros para caracteres. Contudo, a notação com colchetes, oriunda da linguagem B, que antecedeu o C, e que era a única forma dessa linguagem designar seus ponteiros, se tornou obsoleta no C em praticamente todos os outros usos que eram válidos em B. Por essa obsolescência, a maioria das pessoas que conheço prefere usar apenas os asteriscos.
Nota 2: Se você de todo modo não quiser usar a notação de argumentos de
main(), você pode copiar os argumentos para um array (ou outro container qualquer da biblioteca do C++, ou do Boost, ou do Qt, ou qualquer outro).
#include <string>
#include <vector>
int main(int argc, char **argv){
std::vector<std::string> args(argv, argv+argc);
/* ... */
}
EDIT: Nota 3: Você pode ainda criar um vetor que encapsule referências para os argumentos, tendo cópias apenas de ponteiros, mas não dos dados apontados, que serão exatamente os mesmos referenciados por
argv.
int main(int argc, char **argv){
// Crio um vetor constante, e faço com que os ponteiros tratem os textos dos
// argumentos como constantes; assim, não corro o risco de alterar sem querer
// a lista de argumentos.
const std::vector<const char *> args(argv, argv+argc);
/* ... */
}