2016-11-09 8 views
1

私はコマンドライン引数を解析するためにgetoptを使用しています。私のオプションにはオプションがいくつかあるということです。私のプロジェクトはマップの異なるバックエンド実装をテストすることで、-bフラグはどの実装を使うかを指定します。オプションのほとんどはまっすぐですが、ハッシュテーブルを使用するバックエンド(連鎖型およびオープン型)には、末尾に追加して負荷係数を指定できる追加の番号があります。したがって、-b chained-0.75となります。オプションにオプションがあるときにgetoptを使うC++

文字列の "連鎖"部分を無視し、それを変換するためにatof()を使用するので、私は8から最後(または "オープン"オプション)の部分文字列を取ります。二重にして、私の地図を宣言してください。私はoptargがchar配列(?)だと信じていますが、試しても型不一致エラーに陥ってしまいますstd::string str(optarg);else if (strcasecmp(optarg, "chained") == 0)の代わりに何を書いていいのかわからないので、最後に数字がある可能性があります。だから今私が行うとき-b chained-0.75それは使用関数を呼び出します。ここで

は、私がこれまで持っているものです。

while ((c = getopt(argc, argv, "hb:n:p:")) != -1) { 
    switch (c) { 
     case 'b': 
      if (strcasecmp(optarg, "unsorted") == 0) { 
       map = new UnsortedMap(); 
      } else if (strcasecmp(optarg, "sorted") == 0) { 
       map = new SortedMap(); 
      } else if (strcasecmp(optarg, "bst") == 0) { 
       map = new BSTMap(); 
      } else if (strcasecmp(optarg, "unordered") == 0) { 
       map = new UnorderedMap(); 
      } else if (strcasecmp(optarg, "chained") == 0) { 
       double load_factor; 
       std::string str(optarg); 
       std::string ld_str = str.substr(8, str.length()-1); 
       load_factor = atof(ld_str); 
       map = new ChainedMap(load_factor); 
      } else if (strcasecmp(optarg, "open") == 0) { 
       map = new OpenMap(); 
      } else { 
       usage(1); 
      } 
      break; 

任意のヒントやアイデアをいただければ幸いです!

答えて

2

strcasecmp()は完全一致比較関数ですが、このstrcasecmp()は明らかに "連鎖0.75"と一致しません。 strcasecmp()が "連鎖"という文字列とマッチする唯一のものは、連鎖されたものではなく、 "連鎖された0.75"ではなく "変更された連鎖"ではなく "連鎖"です。

右関数はstrncasecmpです:あなたは "chained-" と比較すると、ちょうど "連鎖" していない

} else if (strncasecmp(optarg, "chained-", 8) == 0) { 

注意。思考のしばらくの間、なぜそれが明確になるはずです。

既存のコードでは、atof()は解析エラーを処理しないため、「連鎖」の後の文字列が数字ではない可能性も考慮に入れません。ここでエラーを検出して処理できるようにする必要がある場合は、atof()の代わりにstrtod()を使用してください。

+0

これはまさに私が必要としていたものです。それが私の問題の1つを解決しました - ありがとう! – Catherine

関連する問題