我想要做的是从命令行获取更多参数,并让它们在新行上输出每个参数。我怎么能通过保持相同的结构来做到这一点?我也希望获得-f输出。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <getopt.h>
int
main(int argc, char *argv[])
{
int nod1, opt;
int nsecs, nod2;
nsecs = 0;
nod2 = 0;
nod1 = 0;
while ((opt = getopt(argc, argv, "nf:")) != -1) {
switch (opt) {
case 'n':
nod1 = 1;
break;
case 'f':
nsecs = atoi(optarg);
nod2 = 1;
break;
default: /* '?' */
fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n",
argv[0]);
exit(EXIT_FAILURE);
}
}
printf("nod1=%d; nod2=%d; optind=%d\n", nod1, nod2, optind);
if (optind >= argc) {
fprintf(stderr, "Expected argument after options\n");
exit(EXIT_FAILURE);
}
printf("Output = %s\n", argv[optind]);
/* Other code omitted */
exit(EXIT_SUCCESS);
}
来自评论:
-f
之后的参数应该是可选的,我想列出彼此传递的每一个参数......$ ./partitioner -n 4 -f Test1 Test2 Test3 Test4 Number:4 File names: Output = Test1 Output = Test2 Output = Test3 Output = Test4 $
答案 0 :(得分:0)
考虑到Jonathan Leffler的评论,我编辑了我的答案:
POSIX getopt()并没有明智地处理可选参数。 GNU getopt()有点好,但不是很多。尽可能避免使用它们。
我提出了一个简单的想法,但可以解决你的问题,所以这里是:
在argv
中,您有一个参数列表,因为它们在推荐行中是正确的吗?因此,如果您在-f
中找到任何argv
,则表示-f
之后的所有参数,直到另一个选项或参数列表的结尾是您要打印的选项。
从-f
到另一个选项(在这种情况下为-g):
./ command -a A -b B -f 一棵二树 -g G
从-f
到最后。
./ command -a A -b B -f 一棵二树
这里有一个帮助函数:
bool get_f_args(int argc, char *argv[], int &count, int* indexes)
{
bool f_found = false, parsing_f_args = false;
int collect_count = 0;
if (argc < 3) return false; // "./command -f" are just two values for argv
// we need at least 3.
// Check for every argument in the argument list.
for (int i = 1; i < argc; i++)
{
// If you found another option
// stop collecting args.
if (argv[i][0] == '-' && parsing_f_args) // options starts with '-' character.
parsing_f_args = false;
if (parsing_f_args)
indexes[count++] = i;
// If some is "-f" then the following are the
// ones you're looking for. We check for -f after
//
// indexes[count++] = i;
//
// in roder to avoid adding -f index to indexes.
if (strcmp("-f", argv[i]) == 0) {
parsing_f_args = true;
f_found = true;
}
}
return f_found;
}
这是一个使用示例:
int main(int argc, char* argv[])
{
int count = 0;
int indexes[10];
bool f_found = get_f_args(argc, argv, count, indexes);
if (f_found){
for (int i = 0; i < count; i++)
printf("Ouput = %s\n", argv[indexes[i]]);
}
return 0;
}