比较Qsort中的字符串

时间:2019-02-07 01:24:54

标签: c++ string qsort

每当我在qsort中比较字符串时,顺序都是完全错误的。例如,输入为

45 4 9 22 2

但我的输出是

22 45 4 9 2

这是我的比较功能

int cmpString(const void *a, const void *b) {
  const Node *a1 = *(const Node **)a;
  const Node *b1 = *(const Node **)b;

  return a1->s.c_str() - b1->s.c_str();
}

不要告诉我使用sort(),我不能执行此作业

1 个答案:

答案 0 :(得分:1)

此行是您代码的主要问题。

return a1->s.c_str() - b1->s.c_str();

其背后的原因是您要在此处减去两个指针,在这种情况下,这不是比较器应该执行的操作。比较器根据内容进行比较。

相反,请尝试以下操作:

int length1 = a1->s.size();
int length2 = b1->s.size();

for (int i = 0; i < min(length1, length2); i++) {
    if (a1->s[i] != b1->s[i]) { // if characters are not same, return difference of their ASCII values.
        return a1->s[i] - b1->s[i];
    }
}

return length1 - length2; // if they are same till now, then shorter string should appear first. That's why it is required.

建议:

如果您使用C ++进行编码,请使用STL。 sort()提供了一个不错的功能<algorithm>,它使您无需使用void *

即可完成相同的操作

更新

根据user4581301的正确建议,您可以直接使用std :: string :: compare。

赞:

return (a1->s).compare(b1->s);