2016-11-09 26 views
1

我使用getopt來解析命令行參數,我的問題是我的一些選項有選項。我的項目是測試映射的不同後端實現,-b標誌指定要使用的實現。大多數選項都很簡單,但對於使用散列表(鏈接和打開)的後端,還有一個附加的數字可以添加到最後以指定加載因子。所以這將是-b chained-0.75當選項有選項時使用getopt C++

我的想法是,我會從8到最後(或5爲「打開」選項)的子字符串,因爲它會忽略字符串的「鏈接」部分,然後使用atof()來轉換它加倍,然後宣佈我的地圖。我相信optarg是一個字符數組(?),並且即使我嘗試過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()明顯不符合「chained-0.75」。 strcasecmp()匹配字符串「鏈接」的唯一的事情是「鏈接」,而不是「鏈接-0.75」,而不是「改變 - foobar」,而不是「鏈接任何東西」。

右邊的功能是strncasecmp

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

注意,您比較反對「鏈狀式」,而不僅僅是「鏈接」。思考的一些時刻應該明確爲什麼。

現有的代碼也未能考慮到「chained-」之後的字符串不是數字的可能性,因爲atof()不處理分析錯誤。如果您需要在此處檢測並處理錯誤,請使用strtod()而不是atof()

+0

這正是我所需要的,解決了我的一個問題 - 謝謝! – Catherine