一个类项目涉及排序字符串数组,与含有像这样的相等数目的列的每串:

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

程序接受命令行参数为哪一列进行排序,并应打印出排序字符串未修饰

我想用的strtok到每一串的拷贝分裂成列,并且使结构为这样的每一行:

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

我的问题是在比较函数指针的qsort需要作为ARG。如果我理解正确的话,比较函数必须采取两种常量空指针的的项目进行排序的,并返回一个int。这意味着我无法通过指针结构将比较功能,因为这是不是快速排序将被排序。我不能在列号传递给排序比较函数,因为它只能采取有两个参数。我怎样才能解决这个基于特定列这些字符串进行排序?

编辑:排序仅限于快速排序还是我自己,如果我真正想要的。给出的选择,我选择的qsort。 :)

修改#2:的共识似乎是要么使用全局变量的列号,或只是使用的qsort排序结构的数组。我没有想到的只是排序结构,并使用指针在他们打印出原始字符串。我认为这是我会做什么。感谢您的帮助大家!

有帮助吗?

解决方案

可以通过结构是这样的:

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);

其他提示

假设你并不限于使用的qsort,可以使用std ::排序,与存储的列数函子对象。如果你必须使用快速排序,一个快速和肮脏的解决办法是将存储在一个全局变量的列数和使用,在comparisson功能。

不同的比较器的功能,所有这些取整结构,但每个仅使用一个列比较。

C ++或C?根据您的标签,我以为这是C ++。让我们试试STL的方式。

您应该使用std::sort代替qsort的。 std::sort可以采取不仅函数指针(相比其C替代),但任何的对象可以作为函数调用。你可能知道类的实例可以被称为与operator()功能。然后将溶液很简单:创建一个“仿”类,将在建设创造不同的功能。然后排序呼叫看起来像:

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

在仿函数类有效地创建一个所谓的“封闭”:具有本地变量动态创建的功能对象,但不与这种方式创建的其它功能对象共享它们。它是这样的:

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,不幸的是,你不能这样做的其他方式比创建一个全局变量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top