尝试使用qsort对cstring进行排序

时间:2014-07-10 00:34:33

标签: c++ parameters const cstring qsort

我正在尝试排序两个cstrings,并且在使用qsort完成此任务时遇到了麻烦。我相信我的问题是,如果我的比较函数是正确的,或者甚至根本不需要编写我自己的比较函数,我不确定将什么作为比较参数。

#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;


bool anagram(const char *s1, const char *s2);

int main() {
    string sWord1, sWord2;  
    char cWord1[10], cWord2[10];
    char *cPtr1 = cWord1;
    char *cPtr2 = cWord2;

    cout << "Enter Word 1: ";
    cin.getline(cWord1, 10);

    cout <<"\nEnter Word 2: ";
    cin.getline(cWord2, 10);

    anagram(cPtr1, cPtr2);

    return 0;
}

bool anagram(const char *s1, const char *s2) {
    char w1[10];
    char w2[10];

    for (int i = 0; i < 10; i++) {
        w1[i] = s1[i];
        w2[i] = s2[i];  
    }

    sort(w1.begin(), w1.end());  //DOES NOT WORK
    sort(begin(w1), end(w1)); //DOES NOT WORK - Says begin is not in std 
}

2 个答案:

答案 0 :(得分:1)

在C ++中对char数组进行排序的正确方法是使用std::sort

#include <algorithm>
#include <iterator>
bool anagram(const char *s1, const char *s2) {
    // ...
    std::sort(std::begin(w1), std::end(w1));
    // If you can't use C++11, then use
    // std::sort(w1, w1 + 10); 

    // ...
}

如果由于一些奇怪的原因必须使用qsort,它需要一个函数指针,它带有两个const void *参数,指向要比较的元素:

int compare(const void * e1, const void *e2){
    char c1 = *static_cast<const char *>(e1), c2 = *static_cast<const char *>(e2);
    return c1 - c2;  // <0 if c1 < c2, etc.
}

qsort(w1, 10, sizeof(char), compare);

这很慢,容易出错,并且会导致非竞争类型的未定义行为,因此不推荐使用。

答案 1 :(得分:0)

这是您尝试编写代码时的代码。但正如已经指出的那样,qsort不是首选方法。

#include <cstdlib>
#include <cstring>
#include <iostream>


int compare(const void* c1, const void* c2) {
  const char& cc1 = *static_cast<const char*>(c1);
  const char& cc2 = *static_cast<const char*>(c2);
  return cc1 - cc2; }


bool anagram(const char* s1, const char* s2) {
  char w1[10];
  char w2[10];

  for (int i = 0; i < 10; i++) {
    w1[i] = s1[i];
    w2[i] = s2[i]; }

  qsort(w1, 10, sizeof(char), compare);
  qsort(w2, 10, sizeof(char), compare);
  return 0 == strncmp(w1, w2, 10); }


int main(int, char* []) {
  std::cout << anagram("abcdefghij", "bcdaghefji") << std::endl;
  std::cout << anagram("abcdefghij", "xxxxxxxxxx") << std::endl;
  return 0; }