#c #argv #argc
#c #argv #argc
Вопрос:
был задан вопрос по этому поводу, в основном, связанный с argc…фактически не имея argc
если заданный вами argv, который, как я понимаю, по сути, представляет собой массив указателей на соответствующие массивы символов каждого введенного аргумента,
как бы я на самом деле подсчитал количество указателей в argv?
Ответ №1:
Стандарт C определяет:
argv[argc] shall be a null pointer.
Таким образом, вы всегда можете определить конец путем тестирования на 0
.
Ответ №2:
В общем, вы не можете, если массив специально не заканчивается некоторым значением «stop», таким как 0
или NULL
. Это причина argc
существования. Сами указатели не имеют длину / количество / количество элементов, связанных с ними.
При передаче указателей на массивы вы обязательно должны также указать количество элементов или явно выделить слишком много элементов и добавить элемент «null» в конец массива.
Комментарии:
1. @JensGustedt Прочтите еще раз, пожалуйста. Я конкретно сказал «В целом» и ответил в контексте всех массивов , а не конкретно
argv
.2. @meegar, ну, что ж, тогда ваша вторая фраза не имеет особого контекста для ссылки.
argc
существует для удобства (или традиции) и, строго говоря, не является необходимым.3. 1 за указание шаблона массива с нулевым (или любым другим) завершением, что делает ненужным перенос дескриптора размера с ним.
4. Этот ответ не соответствует вопросу. OP запрашивает arg{v, c}, а не «все массивы»
5. @RobertMartin На самом деле, OP спрашивал о «массивах C» конкретно argv. Мой ответ охватывает оба. Прочитайте заголовок вопроса: «как определить, когда вы достигли конца массива C? (в частности, argv)»
Ответ №3:
Я не согласен с некоторыми людьми здесь.
сам argv завершается нулем. Например, если вы введете
$./foobar hello strawberry
вы получите
argv = [%p] [%p] [%p] [NULL]
| | |
| | _"strawberry"
| |
| _"hello"
|
_"./foobar"
Другими словами, такой код будет работать:
while (*argv) {
printf("%sn", *argv);
argv ;
}
Попробуйте и убедитесь!
Комментарии:
1. Возможно, вы правы в том, что он заканчивается на NULL в комментарии Jens, но предполагать, что это будет NULL, не зная стандарта, — плохая идея.
2. app.execve.01.02 «argv: приложение должно убедиться, что последний элемент этого массива является нулевым указателем».
Ответ №4:
Вы не можете. После того, как массив заканчивается, возникает случайность, и вы не можете точно отличить случайность от реальных данных.
Ответ №5:
Вы должны использовать argc, который всегда присутствует при предоставлении argv. Последний указатель на символ в argv находится в argv[argc-1]