我正在尝试排序两个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
}
答案 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; }