如何计算 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
解释为带有参数 2
的 c
选项,即使第一个是单个命令行参数而第二个是两个参数.
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]);
}
我在获取正确数量的参数时遇到问题:
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
解释为带有参数 2
的 c
选项,即使第一个是单个命令行参数而第二个是两个参数.
argc
告诉您传递了多少命令 lime 参数,但它不能告诉您将解析多少选项。不过,这应该不是问题。
这听起来像 XY problem。我怀疑您想要计算 getopt
处理的参数数量的原因是为了访问任何以下不是选项的参数。
man page指向解决方案:
If there are no more option characters,
getopt()
returns -1. Thenoptind
is the index inargv
of the firstargv
-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]);
}