我在一本书中看到了这个源代码:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char *delivery = "";
int thick = 0;
int count = 0;
char ch;
while ((ch = getopt(argc, argv, "d: t")) != EOF)
switch(ch)
{
case 'd':
delivery = optarg;
break;
case 't':
thick = 1;
break;
default:
fprintf(stderr, "Unknown option: '%s'\n", optarg);
return 1;
}
argc -= optind;
argv += optind;
if (thick)
puts("Thick Crust.");
if (delivery[0])
printf("To be deliverd %s\n", delivery);
puts("Ingredients: ");
for (count = 0; count < argc; count++)
puts(argv[count]);
return 0;
}
我可以理解整个来源,除了:
argc -= optind;
argv += optind;
我知道什么是argc和argv,但是在这两行中发生了什么,什么是“optind” 解释一下。
谢谢。
答案 0 :(得分:4)
getopt
库提供了几个帮助解析命令行参数的函数。
当你调用getopt
时,它“吃掉”可变数量的参数(取决于命令行选项的类型); “吃掉”的参数数量在optind
全局变量中显示。
您的代码使用argv
调整argc
和optind
来跳转刚刚使用的参数。
答案 1 :(得分:3)
它是getopt
使用的全局变量。
从手册:
getopt()函数解析命令行参数。它的论点 argc和argv是传递给main()的参数count和数组 程序调用的功能。
变量optind是要处理的下一个元素的索引 在argv。系统将此值初始化为1。
该代码只是更新argc和argv以指向其余参数(跳过-
个选项)。
答案 2 :(得分:2)
关于如何:
optind是argv的元素数,在此代码后将被忽略:
argc -= optind; // reduces the argument number by optind
argv += optind; // changes the pointer to go optind items after the first one
argc(计数)因optind而减少
并且相应地升级指向argv的第一个元素的指针。
关于原因:
见Karoly的回答。
答案 3 :(得分:0)
在运行此代码时,您可以将其执行为./executable_file:name -d some_argument
当调用getopt时,它开始扫描在命令行中写入的内容。 argc = 3,argv [0] =。/ executable_file:name argv [1] = - d argv [2] = some_argument。 getopt将获得选项d,时间optind = 2,即下一个的索引,即argv [2]。 因此optind + argv将指向argv [2]。
一般来说,optind会有下一个索引。