在C中使用命令行选项

时间:2016-09-13 02:12:16

标签: c command-line getopt

我有一个哈希表程序,我正在尝试实现命令行选项输入。默认操作是创建哈希表并读入文本文件,这是在检查选项后完成的。这些选项主要在创建哈希表之前更改其属性,例如-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;
        }
     }

1 个答案:

答案 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);
}