Как узнать, когда вы достигли конца массива C? (в частности, argv) - PullRequest
3 голосов
/ 11 ноября 2011

был задан вопрос по этому поводу, в основном он придумал argc ... фактически без argc

, если вы указали argv, который, как я понимаю, по сути, массив указателей на соответствующие массивы char каждого введенногоаргумент,

как бы я мог посчитать количество указателей в argv?

Ответы [ 5 ]

8 голосов
/ 11 ноября 2011

Стандарт C определяет:

argv[argc] shall be a null pointer.

Таким образом, вы всегда можете определить конец, протестировав 0.

2 голосов
/ 11 ноября 2011

Я не согласен с некоторыми людьми здесь.

Сам argv прекращен.Например, если вы введете

$./foobar hello strawberry

, вы получите

argv = [%p]  [%p]  [%p]  [NULL]
        |     |     |    
        |     |      \_"strawberry\0"
        |     | 
        |      \_"hello\0"
        |    
         \_"./foobar\0"

Другими словами, этот код будет работать:

while (*argv) {
    printf("%s\n", *argv);
    argv++;
}

Попробуйтеи смотри!

2 голосов
/ 11 ноября 2011

Как правило, вы не можете, если массив не завершен каким-либо «стоп» значением, таким как 0 или NULL. Это причина argc существует. Сами указатели не имеют длину / количество / количество элементов, связанных с ними.

При передаче указателей на массивы вы также должны обязательно указывать количество элементов или явно выделять элементы «слишком много» и добавлять «нулевой» элемент в конец массива.

1 голос
/ 11 ноября 2011

Вы не можете. После окончания массива возникает случайность, и вы не можете точно отличить случайность от реальных данных.

0 голосов
/ 11 ноября 2011

Вы должны использовать argc, который всегда присутствует, когда предоставляется argv.Последний указатель на символ в argv находится в argv [argc-1]

...