我正在用C编写一个程序,它有几个参数,我可以在运行它时在命令行中输入。例如:
./proj select row 3 <table.txt
打印第3行。
在我的计划中,我有很多if
/ else
。例如,如果argv [1]为select而argv [2]为row,则执行此操作,依此类推。我把它展示给了我的老师,被告知不要用if-else而是用结构来做这件事。而问题是我不知道如何。你能给我一些关于如何开始的简单建议吗?
答案 0 :(得分:0)
使用getopt
处理命令行选项。这是一个例子:
http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html
在你的情况下,我认为如下:
./proj -r 3 <table.txt
会很好。所以在你的getopt while循环中,你要检查'r'参数并存储它的值。然后在代码中使用该值。类似的东西:
int row_num = -1;
while ((c = getopt (argc, argv, "r:")) != -1)
switch (c)
{
case 'r':
row_num = optarg;
break;
case '?':
if (optopt == 'r')
fprintf (stderr, "Option -%c requires an argument.\n", optopt);
else if (isprint (optopt))
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr,
"Unknown option character `\\x%x'.\n",
optopt);
return 1;
default:
abort ();
}
printf ("row_num = %d\n", row_num);
/* Now use your row_num variable here. */
return 0;
}
请注意,您也可以将输入文件的名称作为参数,然后您就不必像现在一样将其输入。类似的东西:
./proj -r 3 -f table.txt
你会在互联网上找到更多关于getopt的例子。
答案 1 :(得分:0)
有几点。
首先,我使用getopt_long()
解析命令行。
#include <getopt.h>
int opt = 0;
int opt_index = 0;
static const char sopts[] = "s:"; /* Short options */
static const struct option lopts[] = { /* Long options */
{"select", required_argument, NULL, 's'},
{NULL, 0, NULL, 0}
};
while ((opt = getopt_long(argc, argv, sopts, lopts, &opt_index)) != -1) {
/* use a switch/case statement to parse the arguments */
}
其次在使用结构的情况下。我想到了一些事情:
struct opts {
int num;
char *select;
}
将行号放入num
,将选择变量(在您的情况下为row
)放入select
数组。
当然,您需要填写代码的其余部分。但这是朝着这个方向发展的一个起点和点。