Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的qsort+;对于字符串数组?_C++_Sorting_Qsort - Fatal编程技术网

C++ C+中的qsort+;对于字符串数组?

C++ C+中的qsort+;对于字符串数组?,c++,sorting,qsort,C++,Sorting,Qsort,我正在开发一个程序,它接受用户输入的单词列表,忽略大小写(大写和小写),然后使用qsort函数对它们进行排序。我对qsort有一个问题,因为我不知道传递什么作为第三项qsort(数组、sizeOfArray、?和funcCompare)。谁能给我指一下正确的方向吗 using namespace std; int compare(const void* , const void*); const int SIZE = 100; void main() { int i = 0; int s

我正在开发一个程序,它接受用户输入的单词列表,忽略大小写(大写和小写),然后使用qsort函数对它们进行排序。我对qsort有一个问题,因为我不知道传递什么作为第三项qsort(数组、sizeOfArray、?和funcCompare)。谁能给我指一下正确的方向吗

using namespace std;

int compare(const void* , const void*);

const int SIZE = 100;
void main()
{

int i = 0;
int s = 0;
size_t size = 0;
string words;
string list[SIZE];
for (i = 0; i < SIZE; i++)
{
    cout << "Please enter a word. Press ^Z to quit: " << endl;
    cin >> words;
    transform(words.begin(), words.end(), words.begin(), ::tolower);
    if (words.length() > size)
    {
        size = words.length();
    }
    list[i] = words;
    if (cin.eof())
    {
        s = i;
        break;
    }
}
qsort(list, s, ?? , compare);
for (int j = 0; j < i; j++)
    {
        cout << list[j] << endl;
    }   
}

int compare(const void* p1, const void *p2)
{
char char1, char2;

 char1 = *(char *)p1;  // cast from pointer to void
 char2 = *(char *)p2;  // to pointer to int

 if(char1 < char2)
     return -1;
 else
 if (char1 == char2)
    return 0;
 else
    return 1;
 }
使用名称空间std;
整数比较(常数无效*,常数无效*);
常数int SIZE=100;
void main()
{
int i=0;
int s=0;
大小\u t大小=0;
字符串;
字符串列表[大小];
对于(i=0;i大小)
{
大小=字数。长度();
}
列表[i]=单词;
if(cin.eof())
{
s=i;
打破
}
}
qsort(列表,s,?比较);
对于(int j=0;jcout您需要传递数组中每个元素的大小,以字节为单位

这是通过:
sizeof(string)

编辑:查看Alexlider的帖子,了解更多信息


不久前,我为BRL-CAD编写了一个qsort字符串比较函数,下面是使用的比较函数(请记住用C编写,可以优化)


从技术上讲,您需要通过sizeof(string)

但std::string不是普通类型,因此不允许使用
qsort
对字符串数组进行排序

25.5 C库算法 4函数签名:
qsort(void*,size\u t,size\u t,int(*)(const void*,const void));
替换为两个声明:
外部“C”空qsort(空基、大小nmemb、大小大小、整数(比较)(常数空、常数空*);
外部“C++”void qsort(void*base,size\u t nmemb,size\u t size,int(compar)(const-void,const-void*);
它们都具有与原始声明相同的行为。除非 基指向的数组中的对象属于普通类型


如果使用C++和STD::string,也应该使用STD::vector代替普通数组和:St::QueD代替QQuo.< /P>这是一个赋值,还是在寻找一个好的C++解决方案来解决这个一般问题?使用<代码> STD::排序< /COD>和 STD::vector < /COD>,如果你必须使用<代码> qSoS> <代码>,不要使用<代码> STD::STRing。如果确实必须,请在数组中使用指向

std::string
的指针。我尝试了
sizeof(string)
,但它没有做任何事情。它所做的只是按照输入的顺序显示单词。请看一个与qsort()结合使用的字符串排序函数示例赋值要求我使用qsort,而你不能对向量使用qsort,或者我已经读过了。@Kyle很遗憾,你也不能对字符串数组使用qsort,如果你真的绑定到qsort,你可以在数组中存储指针,并提供比较函数来比较实际字符串,但qsort本身将是排序点ers@Kyle:当然,如果你真的想,你可以在向量上使用
qsort
;向量中的对象存储在数组中。(当然,你不想这样做,因为
std::sort
更安全,可能更快)但是,正如答案所说的,你不能用它来排序一个数组:<代码> STD::String 。如果你的任务要求你这样做,那么它就要求不可能。@ Kelle:请把你的指导老师请到第25.5节第4页,第877页:这份文件是官方C++标准的当前草案。官方C++网站。为了一个不太正式的反驳,请参阅下面的“注释”部分:如果大小固定,没有什么错误。只需使用<代码>排序(开始(PrimeLaar),Enter(PursixLaar));< /C>
qsort(list, s, sizeof(string), compare);
 * Sort function called by quick sort to sort data according
 * to its second field in the string
 */
int
sort(const void* a, const void* b)
{
    char *ia = *(char**)a;
    char *ib = *(char**)b;

    char Str[MAX_RESULT_LEN];
    char Str2[MAX_RESULT_LEN];

    //get string into array
    GetStr(ia, Str);
    GetStr(ib, Str2);

    int n1 = atoi(Str);
    int n2 = atoi(Str2);
    return (n2 - n1);
}