2017-01-27 6 views
3

コマンドライン引数の配列をソートしたい。すべての引数は整数です。 ここに私のコードですが、動作しません。私は./a.out 4 3 2 1呼ばれたときに、コンパイルした後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; 
    } 
} 

、それはまだ代わりに1 2 3 4の画面に4 3 2 1を印刷します。 どうしたの?

ありがとうございます。

+3

'argv [j] - '0''はあなたが思っていることをしません。 –

+0

ええ、多分、あなたは 'argv [j] [0] - '0' Gassa

+0

さようなら!解決済み! – Nicole

答えて

5

あなたがラムダのためautoタイプを使用することができ++現代のC言語でカスタムコンパレータ

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

<algorithm>からstd::sortを試してみてください。文字列からintへの変換では、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

関連する問題