2016-09-13 9 views
-1

私はハッシュテーブルプログラムを持っており、コマンドラインオプション入力を実装しようとしています。デフォルトのアクションは、ハッシュテーブルを作成してテキストファイルで読み込むことです。これは、オプションをチェックした後に行われます。オプションは、作成前にハッシュテーブルのプロパティを変更することがほとんどです。たとえば、-fオプションはテーブルサイズを指定します。Cでのコマンドラインオプションの取得

例えば./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); 
    } 
    } 

私の問題は、私は任意の順序でこれらのフラグ/オプションを入力したいということです。引数(2番目のテキストファイルの名前)を取るオプション-eがあります。ハッシュテーブルを作成し、最初のテキストファイルを読み込み(デフォルトのアクションのように)、ハッシュテーブルを検索して2番目のファイルの単語を探し、未知数の単語を出力します。 また、デフォルト以外のテーブルサイズを使用する-fオプションもあります。以下のコマンドを実行すると、予想通りの動作が得られます。

./program < words.txt -f 350 -e other_words.txt 

-fオプションが最初に発見されたとtablesize変数が与えられた350 -eオプションが見つかり、この更新された値を使用して行われるにデフォルト値から変更されています。

しかし、同じ目的の動作とは異なる順序で:

./program < words.txt -e other_words.txt -f 350 

-eオプションは、デフォルトのテーブルサイズで行われ、後にのみ発見され、tablesizeを変更してからでない-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

こんにちは。あなたの質問をより明確にするためにコードを減らす方法については、[mcve]を見てください。 –

+1

そこには技術的に質問はありませんでした。その美しい展覧会の後に私たちに何かを具体的に尋ねずに推測させてください。 –

+1

注文が重要な場合は、最初にすべての引数を収集し、すべてのコードを取得したら、それぞれのコードを実行する必要があります。オプション 'f'が' tablesize'を設定している場合(例えば-1などのように初期化できません)、オプションが 'e'の場合、ファイル名をどこかに入れます(例:NULLに初期化します)。 'tablesize!= -1'のオプションループチェックの後、そのサイズを設定するには、' filename!= NULL'をチェックしてそのファイルを処理してください。 – deamentiaemundi

答えて

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); 
} 
関連する問題