Почему мы используем arg c в качестве аргумента в функции getopt ()? - PullRequest
4 голосов
/ 04 февраля 2020

Я недавно начал изучать C язык, поэтому я не особо разбираюсь в функциях C.

Недавно я увидел программу, написанную на C в статье Inte rnet. Это было так: -

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    int i = 0;
    int j = 0;
    char ch;

    ch = getopt(argc, argv, "n:");
    if(ch == 'n')
    {
        j = atoi(optarg);
    }

    while(j--)
    {
        printf("%i\n",j);
    }
    return 0;
}

Кто-нибудь может сказать, каково истинное назначение функции argc в getopt()? Использует ли он arg c как для того, где он должен читать опции?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

По моим наблюдениям argc есть для написания простого кода и argv NULL для написания защитного кода.

argv и argc были в подписи main с самого начала C, так же как и NULL в конце списка argv. С тех пор я просмотрел множество C программ, и почти ни одна из них не зависит от этого NULL. Скорее они зависят от argc, чтобы контролировать глубину массива, поскольку это проще и надежнее. Однако защитник-программист также будет искать этот NULL, так как argc и getopt() должны использовать argc, чтобы пожаловаться, если он вызывается слишком много раз.

Кроме того, я видел код, который играет в игры для повторного использования getopt() для анализа вторичных «командных строк» ​​для команд, данных приложению. Не все из них ставят NULL в конце списка (хотя мой сделал).

1 голос
/ 04 февраля 2020

Стандарт C гарантирует, что argv[argc] является указателем NULL:

C Стандарт, §5.1.2.2.1.2:

Если они объявлены, параметры главной функции должны подчиняться следующим ограничениям:

...

- argv [argc] должен быть нулевым указателем.

Технически все, что вам (и функции getopt) действительно нужно, это argv - что-то вроде этого обработает все аргументы:

int i;
for(i = 0; argv[i]; i++)
{
    puts(argv[i]);
}

Однако ничто не остановит вас (или автор getopt) вместо использования argc как al oop guard. Это в равной степени справедливо:

int i;
for(i = 0; i < argc; i++)
{
    puts(argv[i]);
}

Итак, если функция говорит, что ей необходимо передать argc, тогда передайте ей argc, потому что она, вероятно, использует ее для формирования этого типа l * 1032. *.

...