代码之家  ›  专栏  ›  技术社区  ›  Jamison Dance

Q基于c字符串中的列进行排序?

  •  0
  • Jamison Dance  · 技术社区  · 15 年前

    类项目涉及对字符串数组进行排序,每个字符串包含相等数量的列,如下所示:

    Cartwright   Wendy    93
    Williamson   Mark     81
    Thompson     Mark     100
    Anderson     John     76
    Turner       Dennis   56

    该程序接受一个命令行参数,用于对哪个列进行排序,并应不经修改地打印出排序后的字符串。

    struct line {
        char * line;
        char column_to_sort_on[MAX_COLUMN];
    }
    

    我的问题是qsort作为arg使用的比较函数指针。如果我理解正确,比较函数必须采用两个const void指针

    编辑: 排序仅限于qsort或我自己的,如果我真的想。给出选择,我选择qsort.:)

    编辑#2: 共识似乎是要么使用全局变量作为列号,要么只使用qsort对结构数组进行排序。我没有想到只对结构进行排序,并使用其中的指针打印出原始字符串。我想这就是我要做的。谢谢大家的帮助!

    4 回复  |  直到 11 年前
        1
  •  2
  •   sepp2k    15 年前

    假设您不局限于使用qsort,您可以使用std::sort和存储列号的函子对象。如果必须使用qsort,一个快速而肮脏的解决方案是将列号存储在全局变量中,并在comparison函数中使用它。

        2
  •  2
  •   Roberto Bonvallet    15 年前

    不同的比较器函数,所有这些函数都采用整个结构,但每个函数只使用一列进行比较。

        3
  •  2
  •   Nick Dandoulakis    15 年前

    可以按如下方式传递结构:

    struct line {
        char * line;
        char column_to_sort_on[MAX_COLUMN];
    }
    ...
    
    line*  Lines[max_lines]; // here you store the structs
    
    int
    cmp_lines( const void *elem1, const void *elem2 )
    {
        line*  line1 = *(line**)elem1;
        line*  line2 = *(line**)elem2;
        // do the comparisons
    }
    
    qsort(Lines, max_lines, sizeof(line*), cmp_lines);
    
        4
  •  1
  •   P Shved    15 年前

    C++还是C?基于你的标签,我假设它是C++。让我们试试STL方式。

    你应该使用 std::sort qsort . 排序 不仅可以使用函数指针(与C语言相比),还可以使用任何 对象 operator() . 然后,解决方案很简单:创建一个“functor”类,该类将在构造时创建不同的函数。然后,排序调用将如下所示:

    std::sort(array, array+size, comparator(2 /* sort by column #2 */));
    

    functor类有效地创建了一个所谓的“闭包”:一个动态创建的函数对象,具有局部变量,但不与以这种方式创建的其他函数对象共享它们。它看起来是这样的:

    class comparator{
      private: unsigned int field_n;
      public: comparator(unsigned int _field_n) : field_n(_field_n) {};
      public: int operator () (char const *  lhs, char const * rhs)
           { /* compare here fields with index field_n */ };
    };
    

    请注意,比较“函数”(即您创建的类实例)不是空指针,而是 char *

    不幸的是,在C语言中,除了创建一个全局变量之外,不能用其他方法来实现这一点。