char **argv[]
неправильно.Это должно быть либо char **argv
, либо char *argv[]
, а не смесь обоих.И тогда он становится указателем на указатель на символы или, вернее, указателем на c-строки, т. Е. Массивом c-строк.:) cdecl.org также весьма полезен при таких вещах.
Тогда, для доступа, конечно.Просто получи доступ.:) argv[0]
будет первой строкой, argv[3]
будет 4-й строкой.Но я бы совершенно не рекомендовал заменять вещи в массиве, который не принадлежит вам или о котором вы знаете внутренности.
При изменении размера массива, поскольку вы пишете на C ++, используйте std::vector
который делает все сложные вещи для вас и действительно безопасен.Как правило, это зависит от типа массива.Динамически распределяемые массивы (int* int_arr = new int[20]
) могут, статические массивы (int int_arr[20]
) не могут.
Чтобы скопировать все в argv
в один std::string
, переберите массив и добавьте каждую c-строку к вашемуstd::string
.Я не рекомендовал бы, хотя, скорее, иметь std::vector<std::string>
, то есть массив std::strings
, каждый из которых содержит один из аргументов.
std::vector<std::string> args;
for(int i=0; i < argc; ++i){
args.push_back(argv[i]);
}
В вашем последнем пункте, поскольку стандарт требует argv
завершается указателем NULL
, это довольно просто.
int myargc = 0;
char** argv_copy = argv;
while(++argv_copy)
++myargc;
while(++argv_copy)
сначала увеличивает указатель массива, позволяя ему указывать на следующий элемент (например, послеПервая итерация будет указывать на c-строку # 2 (argv[1]
)).После этого, если указатель оценивается как ложный (если это NULL
), то цикл тормозит, и у вас есть myargc
.:)