【问题标题】:Sort command line args in C++在 C++ 中对命令行参数进行排序
【发布时间】:2017-01-27 19:00:17
【问题描述】:

我想对一组命令行参数进行排序。所有参数都是整数。 这是我的代码,但它不起作用。

#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。 怎么了?

提前致谢。

【问题讨论】:

  • argv[j] - '0' 没有做你认为它正在做的事情。
  • 是的,也许你的意思是 argv[j][0] - '0' &lt; argv[pos][0] - '0' 开始,完整的 strcmp 用于多字符参数。
  • 非常感谢!解决了!
  • 请通过发布您的解决方案回馈社区。​​span>

标签: c++


【解决方案1】:

使用自定义比较器尝试 &lt;algorithm&gt; 中的 std::sort

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

【讨论】:

    【解决方案2】:

    在现代 c++ 中,您可以将 auto 类型用于 lambda。对于字符串到 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&lt;std::string&gt;

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

    std::sort 无需使用 lambda 或其他自定义比较器。

    【讨论】:

    • >如果所有命令行参数都是无符号数,只有当它们的长度相同时
    • @RiaD 是的。我的错。已更新。
    猜你喜欢
    • 2014-10-10
    • 2019-11-27
    • 2012-10-25
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2015-06-25
    相关资源
    最近更新 更多