Нахождение количества аргументов в argv?

#c #arguments

#c #аргументы

Вопрос:

Итак, что-то простое вроде этого:

 int main(int argc, char* argv[]) {
    int size = sizeof(argv);
    printf("%d", size);
}
 

Если я передаю ему 5 аргументов, он сообщает мне, что есть 4 аргумента. Если я передаю ему 10 аргументов, он сообщает мне, что есть 4 аргумента. Что-то здесь не так или мой компилятор ошибся?

Комментарии:

1. sizeof(argv) является ли размер указателя, обычно 4 или 8, равным 4 в вашей системе. Возможно, вам следует просто использовать значение в argc , поскольку для этого оно и существует.

2. Количество аргументов представлено переменной argc .

3. Спасибо, ребята. Высоко ценится.

4. Кроме того, argc аргументы 1 из-за исполняемого файла в команде запуска.

5. Стандарт неоднозначен, он просто говорит «имя программы», но не говорит, что именно это означает, и оставляет это на усмотрение реализации, как и все другие аргументы.

Ответ №1:

 int size = sizeof(argv);
 

Это не дает вам количество аргументов в argv массиве, это дает вам размер argv переменной в байтах. Обычно это четыре или восемь для указателей на момент, когда я отвечаю на этот вопрос, и, очевидно, в вашем конкретном случае их четыре.

Если вы хотите знать, сколько элементов в argv , это именно то, что argc нужно.

Целое argc число содержит количество аргументов, включая первый, который обычно представляет запускаемую программу. Итак, вы можете получить аргументы с помощью цикла, подобного:

 #include <stdio.h>
int main(int argc, char *argv[]) {
    for (int i = 0; i < argc;   i) {
        printf("Argument #%d is %sn", i, argv[i]);
    }
    return 0;
}
 

Запуск этого с определенными аргументами показывает это в действии:

 pax$ ./testprog abc def 123 789
Argument #0 is ./testprog
Argument #1 is abc
Argument #2 is def
Argument #3 is 123
Argument #4 is 789
 

Другой способ, поскольку требуется, чтобы это argv[argc] был нулевой указатель, — обойти счетчик и проверить значения напрямую:

 #include <stdio.h>
int main(int argc, char *argv[]) {
    for (char **arg = argv; *arg != NULL;   arg) {
        printf("Argument is %sn", *arg);
    }
    return 0;
}
 

Это имеет немного другой результат, потому что я не использую счетчик, но аргументы точно такие же:

 pax$ ./testprog pax diablo
Argument is ./testprog
Argument is pax
Argument is diablo
 

Ответ №2:

Пожалуйста, обратитесь к документации из gcc здесь

Цитата:

Значением аргумента argc является количество аргументов командной строки. Аргумент argv представляет собой вектор строк C; его элементами являются отдельные строки аргументов командной строки. Имя файла запускаемой программы также включается в вектор в качестве первого элемента; значение argc учитывает этот элемент. Нулевой указатель всегда следует за последним элементом: argv[argc] — это нулевой указатель.

Для команды ‘cat foo bar’ значение argc равно 3, а argv содержит три элемента: «cat», «foo» и «bar».

argc по сути, нужно знать общее количество аргументов командной строки, переданных в командной строке. Даже имя исполняемого файла указано в аргументах команды (если вам интересно, почему — посмотрите здесь (Дополнительно)).

Итак, в качестве короткого ответа argc - 1 вы получите общее количество аргументов. Очень распространенной практикой программирования argc является проверка того, передано ли минимальное требуемое количество аргументов или нет.