【发布时间】:2011-11-21 06:59:42
【问题描述】:
好的,我搜索并发现以下两个 StackOverflow 主题让我朝着正确的方向前进:
Argument-parsing helpers for C/UNIX
Pass arguments into C program from command line
注意:所有代码都是伪代码。将在其工作时发布可编译的代码。
但是,我仍然对如何在 C 中使用 getopt_long() 感到完全困惑。我正在编写的程序被定义为具有以下可能的标签(但可以包含您绝对需要的标签,其余的填写具有空值):
id3tagEd filename -title "title" -artist "artist" -year 1991 -comment "comment" -album "album" -track 1
现在,根据我的阅读,我需要为长选项使用结构,对吗?如果是这样,我写了一些类似的东西:
struct fields field =
{
char *[] title;
char *[] artist;
char *[] album;
int year;
char *[] comment;
int track;
}
static struct options long_options[] =
{
{"title", 0, &field.title, 't'},
{"artist", 0, &field.artist, 'a'},
{"album", 0, &field.album, 'b'},
{"year", 0, &field.year, 'y'},
{"comment", 0, &field.comment, 'c'},
{"track", 0, &field.track, 'u'},
{0, 0, 0, 0}
}
现在,根据我收集到的信息,我会这样称呼它:
int option_index = 0;
int values = getopt_long(argc, argv, "tabycu", long_options, &option_index);
从这里开始,我可以严格使用字段结构并在我的程序中做我需要做的事情吗?但是,如果是这种情况,有人可以解释整个 long_options 结构吗?我阅读了手册页等,我完全糊涂了。通过重新阅读手册页,我可以看到我可以将变量设置为 null,并且应该将我的所有选项要求设置为“required_argument”?然后通过 while() 循环设置结构?但是,我看到正在使用 optarg。这是由 getopt_long() 设置的吗?还是示例中缺少它?
最后一个问题,我总是有一个未命名的必需选项:文件名,我是否只使用 argv[0] 来访问它? (因为我可以假设它会是第一个)。
顺便说一句,这与作业问题有关,但与修复它无关,它更多的是基础,必须先了解通过命令行在 C 中传递和解析的参数。
【问题讨论】:
-
显示的结构定义不会编译。请提供可编译的代码。
-
char *[] title;不是有效的声明。试试char *title[];请注意&field.title将返回char***,这可能不是您想要的。 -
查看 getopt(3) 和 getopt_long(3) 的手册页,都有示例。
-
我收回关于
&field.title的那一点。显然没关系(这是char**)。 -
@JonathanLeffler,它不会因为它是一个结构而编译,还是我做错了什么?我对整个 C 语言还是比较陌生。
标签: c