我有一个哈希表程序,我正在尝试实现命令行选项输入。默认操作是创建哈希表并读入文本文件,这是在检查选项后完成的。这些选项主要在创建哈希表之前更改其属性,例如-f选项指定表大小。
例如./program < words.txt -f 400
我目前正在处理它们:
int main(int argc, char*argv[]){
const char *optstring = "e:f:";
char option;
int tablesize = 100;
int unknown_words, i;
char word[256];
htable h;
default = 1;
while((option = getopt(argc, argv, optstring)) != EOF){
switch (option){
case 'e':
default = 0;
h = htable_new(tablesize);
copy_in(h);
unknown_words = find_words(h, optarg);
printf("%d", unknown_words);
break;
case 'f':
if(optarg && atoi(optarg)>0){
tablesize = atoi(optarg);
}
break;
}
}
if(default==1){
h = htable_new(tablesize);
copy_in(h);
print_stats(h);
}
}
我的问题是我想以任何顺序输入这些标志/选项。我有一个选项-e接受一个参数(第二个文本文件的名称)。它创建一个哈希表并读入第一个文本文件(如默认操作),然后在哈希表中搜索第二个文件中的单词并打印未知数量的单词。 我还有一个选项-f,它指定使用不同于默认值的表大小。如果使用以下命令运行,我会得到预期的行为。
./program < words.txt -f 350 -e other_words.txt
首先找到-f选项,并将tablesize变量从其默认值更改为给定的350.然后找到-e选项并使用此更新值执行。
但是以不同的顺序具有相同的期望行为:
./program < words.txt -e other_words.txt -f 350
-e选项在默认表大小上执行,之后才找到-f选项并更改表格大小,然后不再使用。
我已经完成了下面的工作,但似乎效率低下。基本上,如果找到-e选项,则循环其余选项并首先执行它们。这意味着每个相关选项的重复代码,我很好奇如何处理这个。
while((option = getopt(argc, argv, optstring)) != EOF){
switch (option){
case 'e':
default = 0;
for(i=optind;i<argc;i++){
if(strcmp(argv[i],"-t") == 0){
if(argv[i+1] && atoi(argv[i+1])>0){
tablesize =atoi(argv[i+1]);
}
}
}
h = htable_new(tablesize);
copy_in(h);
unknown_words = find_words(h, optarg);
printf("%d", unknown_words);
break;
case 'f':
if(optarg && atoi(optarg)>0){
tablesize = atoi(optarg);
}
break;
}
}
答案 0 :(得分:3)
典型的方法是不在选项处理程序中进行实际工作;相反,让每个处理程序设置一个变量来跟踪指定选项(以及它的参数是什么)。然后在解析所有命令行选项后,可以按照您想要的顺序处理它们。例如,像:
const char* filename = NULL;
int tablesize = 0;
while ((option = getopt(argc, argv, optstring)) != EOF) {
switch (option) {
case 'e':
filename = optarg;
break;
case 'f':
if (optarg && atoi(optarg) > 0) {
tablesize = atoi(optarg);
}
break;
}
}
if (filename != NULL) {
default = 0;
h = htable_new(tablesize);
copy_in(h);
unknown_words = find_words(h, filename);
printf("%d", unknown_words);
}