Почему мы используем argc в качестве аргумента в функции getopt ()?

Почему мы используем argc в качестве аргумента в функции getopt ()?

04.02.2020 02:41:07 Просмотров 2 Источник

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

Недавно я видел программу, написанную на языке Си в Интернете. Это было примерно так:-

#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()? Использует ли он argc как для upto, где он должен читать параметры?

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/60056635/why-we-use-argc-as-argument-in-getopt-function#comment106218145_60056635
@IanAbbott: это должно быть ответом, нет?
https://stackoverflow.com/questions/60056635/why-we-use-argc-as-argument-in-getopt-function#comment106218193_60056635
@lan Abbott Спасибо за эту ценную информацию.
https://stackoverflow.com/questions/60056635/why-we-use-argc-as-argument-in-getopt-function#comment106222861_60056635
@pizdelect: это устаревший стандарт (текущий есть pubs.opengroup.org/onlinepubs/9699919799/functions/getopt.html ) но это чрезвычайно, педантично ясно в одном случае: "если результирующее значение optind больше, чем argc, это указывает на пропущенный параметр-аргумент, и getopt() возвращает указание на ошибку."В противном случае функция getopt() должна возвращать следующий символ опции (если он найден) из argv, который соответствует символу в optstring" несколько неоднозначна и может быть интерпретирована как enging с argc или с концом массива argv, завершенного нулем.
https://stackoverflow.com/questions/60056635/why-we-use-argc-as-argument-in-getopt-function#comment106223032_60056635
@Р... это относится только к тому случаю, когда вариант требует аргумента, не так ли? Это-1. подраздел " если опция принимает аргумент ...".
https://stackoverflow.com/questions/60056635/why-we-use-argc-as-argument-in-getopt-function#comment106223650_60056635
@pizdelect: правильно. Смотрите вторую часть моего комментария. Но я думаю, что это предполагает, что то же самое должно применяться и в других местах.

Ответы - Почему мы используем argc в качестве аргумента в функции getopt ()? / Why we use argc as argument in getopt() function?

Является ответом!
Gilbert

04.02.2020 07:57:04

По моим наблюдениямargcсуществует для написания простого кода, а argvNULL-для написания защитного кода.

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

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

https://stackoverflow.com/questions/60056635/why-we-use-argc-as-argument-in-getopt-function/60062125#comment106226977_60062125
В некоторых других ответах и комментариях должным образом упоминается стандарт С.... все очень верно. Все очень правильно и правильно. Девиз: знай стандарт. Но мои наблюдения продолжались еще до того, как был написан стандарт ANSI, и стандарт только подтверждает мои наблюдения.
Govind Parmar

04.02.2020 08:20:47

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

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

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

...

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

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

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

Однако ничто не мешает вам (или автору getopt) вместо этого использовать argcв качестве защиты цикла. Это в равной степени справедливо:

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

Таким образом, если функция говорит, что она требует argc, то передайте argc, потому что она, вероятно, использует его для формирования такого типа цикла.

Закрыть X