如何在C中计算argc

如何在C中计算argc,c,arguments,parameter-passing,argv,argc,C,Arguments,Parameter Passing,Argv,Argc,我在获取正确数量的参数时遇到问题: while((opt=getopt(argc, argv, ":a:c:SL")) != -1) 如果我启动脚本: /script-a ok-c 1-S-L argc变量等于7 问题是当我想以/script-a ok-c 1-SS-Largc变量等于7的形式启动脚本时,它应该是8,因为SS(或LL/CC)需要计为2)。您不能这样做。如果是这样的话,那么你需要自己解析这个论点并理解它。大多数标准命令都是这样工作的 您无法更改argc的计数及其计数方式。

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

    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)需要计为2)。

您不能这样做。如果是这样的话,那么你需要自己解析这个论点并理解它。大多数标准命令都是这样工作的

您无法更改argc的计数及其计数方式。要在不使用
getopt
的情况下获得正确的计数数,您只需自己计算
argv

在我的小程序中,如果我需要这种东西,我只需检查每个参数(不带
getopt

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

除了编写自己的解析器选项计数或处理逻辑或类似的东西之外,还有一种更好、更简洁的方法来实现同样的目标。(xtofl的注释)

简单的想法是将多字符选项用于
-s3
这意味着
-SSS
。这样,您就可以轻松地解析它 同时了解用户期望的行为类型 从通过选项指定的程序。1

一个小例子: 一,。使用哪一个是意见的问题。两者在不同的实用程序中同样可用。解释这件事的基本方式发生了一些变化。除此之外,它们基本上是一样的。

你不能那样做。如果是这样的话,那么你需要自己解析这个论点并理解它。大多数标准命令都是这样工作的

您无法更改argc的计数及其计数方式。要在不使用
getopt
的情况下获得正确的计数数,您只需自己计算
argv

在我的小程序中,如果我需要这种东西,我只需检查每个参数(不带
getopt

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

除了编写自己的解析器选项计数或处理逻辑或类似的东西之外,还有一种更好、更简洁的方法来实现同样的目标。(xtofl的注释)

简单的想法是将多字符选项用于
-s3
这意味着
-SSS
。这样,您就可以轻松地解析它 同时了解用户期望的行为类型 从通过选项指定的程序。1

一个小例子:
一,。使用哪一个是意见的问题。两者在不同的实用程序中同样可用。解释这件事的基本方式发生了一些变化。除此之外,它们基本相同。

getopt
-SS
解释为两个
S
选项。类似地,它将
-SL
解释为
S
选项,由
L
选项覆盖。它还将
-c2
-c2
解释为带有参数
2
c
选项,即使第一个是单个命令行参数,第二个是两个参数


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

getopt
-SS
解释为两个
S
选项。类似地,它将
-SL
解释为
S
选项,由
L
选项覆盖。它还将
-c2
-c2
解释为带有参数
2
c
选项,即使第一个是单个命令行参数,第二个是两个参数

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

这听起来像是一个错误。我怀疑您要计算
getopt
进程的参数数量的原因是为了访问以下任何不是选项的参数

解决方案的要点:

如果没有更多选项字符,
getopt()
返回-1。然后
optind
是第一个
argv
元素的
argv
中的索引,该元素不是 选择权

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

int i;
for (i = optind; i < argc; i++) {
    printf("non-option arument: %s\n", argv[i]);
}
这听起来像是一个错误。我怀疑您要计算
getopt
进程的参数数量的原因是为了访问以下任何不是选项的参数

解决方案的要点:

如果没有更多选项字符,
getopt()
返回-1。然后
optind
是第一个
argv
元素的
argv
中的索引,该元素不是 选择权

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

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

arc
<代码>argc!不,
argc
是以空格分隔的参数的数量,它与
getopt
解析它们的方式无关。如果
argc
arc
,为什么要关心值<代码>argc!不,
argc
是以空格分隔的参数的数量,它与
getopt
如何解析它们无关。如果
argc
,为什么要关心这个值?也许
getopt
不允许这样做,因为这不是一个好主意。可能会使用可选的'count'参数
S::C::
来像
program-S-c3
@xtofl一样使用。很抱歉,我的回复太晚了。我今天真的很累。这不是一个e
argc -= optind;
argv += optind;
int i;
for (i = 0; i < argc; i++) {
    printf("non-option arument: %s\n", argv[i]);
}