2017-01-27 65 views
3

我想排序一個命令行參數數組。所有參數都是整數。 這是我的代碼,但它不起作用。在C++中排序命令行參數

#include <iostream> 
using namespace std; 

int main (int argc, char *argv[]) { 
    for (int i=0; i<argc-1; ++i) { 
     int pos = i; 
     for (int j=i+1; j<argc; ++j) { 
      if (argv[j] - '0' < argv[pos] - '0') { 
       pos = j; 
      } 
     } 
     char *tempt = argv[i]; 
     argv[i] = argv[pos]; 
     argv[pos] = tempt; 
    } 
    for (int i=0; i<argc; ++i) { 
     cout << argv[i] <<endl; 
    } 
} 

編譯,當我打電話./a.out 4 3 2 1後,它仍然打印4 3 2 1到屏幕上,而不是1 2 3 4。 有什麼問題?

在此先感謝。

+3

'argv [j] - '0''不會做你認爲它正在做的事情。 –

+0

是的,也許你的意思是'argv [j] [0] - '0' Gassa

+0

thx這麼多!解決了! – Nicole

回答

5

嘗試從<algorithm>std::sort使用自定義比較

std::sort(argv, argv + argc, [](char * const & a, char * const & b) { 
    return atoi(a) < atoi(b); 
}); 
1

在現代C++中,你可以使用auto類型的lambda表達式。對於字符串到整數轉換,我寧願stoi功能比atoi(你可以尋找差異here)。還值得注意的是,第一個參數(argv[0])是一個程序名,例如, ./a.out,所以你需要跳過排序。最後的結果可能是這個樣子的:

#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <string> 

int main (int argc, char *argv[]) { 

    std::sort(argv + 1, argv + argc, [](auto l, auto r){ return std::stoi(l) < std::stoi(r); }); 
    std::copy(argv + 1, argv + argc, std::ostream_iterator<const char*>(std::cout, " ")); 
} 

如果所有的命令行參數與固定位的無符號數算你也可以像串,即對它們進行排序,而不通過std::stoi明確轉換爲數字。在這種情況下std::vector<std::string>可用於:

std::vector<std::string> v(argv + 1, argv + argc); 
std::sort(v.begin(), v.end()); 

沒有必要使用拉姆達或其他自定義比較的std::sort

+0

>如果所有的命令行參數都是一個無符號數 只有它們具有相同的長度 – RiaD

+0

@RiaD true。我的錯。更新。 – alexolut