如何计算 C 中的 argc

How to count argc in C

我在获取正确数量的参数时遇到问题:

    while((opt=getopt(argc, argv, ":a:c:SL")) != -1)

如果我启动脚本: ./script -a ok -c 1 -S -L argc 变量等于 7

问题 是当我想启动脚本时 ./script -a ok -c 1 -SS -L argc 变量等于 7,但它应该是 8 因为(SS(或 LL/CC)需要算作两个)。

你不能那样做。如果是这种情况,那么您需要自己解析参数并自己理解。大多数标准命令都是这样工作的。

您无法更改 argc 的计数及其计数方式。要在没有 getopt 的情况下获得正确的计数,您可以自己简单地计算 argv

在我的小程序中,如果我需要这种东西,我只是检查每个参数(没有 getopt)。

使用getopt可以正确获取所有选项。您可以获得 -SSS 然后您可以根据该选项决定行为是什么。

无需编写您自己的 解析器 选项计数或处理逻辑或类似的东西,有一种更简洁的方法可以实现相同的目的。(xtofl 的评论)。

The simple idea is to use the multicharacter options to be -S 3 which would mean that -SSS. This way you can always parse it easily and also get the idea also about what kind of behavior user expects from the program specified through the options.1

一个小例子:

static const char help[] =
    "  -h       help help all this\n"
    "  -m times multiply by times\n"
    "  -s size  shift by size\n"
    "  -a add   addition by add\n"
    ;

int opt;
while ((opt = getopt(argc, argv, "hm:s:a:")) != -1)
{
    switch (opt)
    {
    case 'h':
        puts(help);
        return EXIT_SUCCESS;
    case 'm':
        opm = atoi(optarg);
        break;
    case 's':
        ops = atoi(optarg);
        break;
    case 'a':
        opa = atoi(optarg);
        break;
    default:
        return EXIT_FAILURE;
    }

1。使用哪一个是见仁见智的。两者在不同的实用程序中同样可用。解释事物的基本方式发生了一些变化。除此之外,它们大部分是相同的。

getopt 会将 -SS 解释为两个 S 选项。同样,它会将 -SL 解释为 S 选项后跟 L 选项。它还会将 -c2-c 2 解释为带有参数 2c 选项,即使第一个是单个命令行参数而第二个是两个参数.

argc 告诉您传递了多少命令 lime 参数,但它不能告诉您将解析多少选项。不过,这应该不是问题。

这听起来像 XY problem。我怀疑您想要计算 getopt 处理的参数数量的原因是为了访问任何以下不是选项的参数。

man page指向解决方案:

If there are no more option characters, getopt() returns -1. Then optind is the index in argv of the first argv-element that is not an option.

while 循环完成后,您可以执行以下操作:

int i;
for (i = optind; i < argc; i++) {
    printf("non-option arument: %s\n", argv[i]);
}

或者,您可以向上移动 argv 使其指向第一个非选项参数,并相应地减少 argc。然后就可以从0开始索引了:

argc -= optind;
argv += optind;
int i;
for (i = 0; i < argc; i++) {
    printf("non-option arument: %s\n", argv[i]);
}