使用qsort() c;对指向char的指针排序



我有一个指向char的指针和一个c-string集合

d|o|g||g|h|o|s|t||r|e|a|p|e|r|

我正在使用c库中的qsort()方法,我想对它进行升序排序但是我对如何通过字符串而不是通过char来缩短这个感到困惑。

我有一个指向原始指针开始的char指针,但我需要的是对原始char指针进行排序,而不是对新char*进行排序,并且仍然对新char*进行排序。没有悬空指针

需要在原始数组的每个字符串的开头创建一个char*数组。然后你可以用任何你需要的排序函数对新的char*数组进行排序。

下面是一个示例。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
size_t multi_string_count(char* str) {
    size_t count = 0;
    while(*str) {
        ++count;
        str += strlen(str) + 1;
    }
    return count;
}
char** split_multi_string(char* str, size_t* numberOfStrings) {
    size_t i;
    char** strArray;
    *numberOfStrings = multi_string_count(str);
    // allocate a new block of memory to hold the array
    strArray = (char**)malloc(*numberOfStrings * sizeof(char*));
    for(i=0; i < *numberOfStrings; ++i) {
        // store the starting address of the string into the array
        strArray[i] = str;
        str += strlen(str) + 1;
    }
    return strArray;
}
int my_comp (const void* p1, const void* p2) {
    return strcmp((const char*)p1, (const char*)p2);
}
int main(int argc, char* argv[]) {
    size_t i, arrayLength;
    char** strArray;
    char* multiStr = "dogghostreapercat";
    strArray = split_multi_string(multiStr, &arrayLength);
    // Sort the array of pointers by the comparitor function
    qsort(strArray, arrayLength, sizeof(char*), my_comp);
    for(i=0; i < arrayLength; ++i)
        printf("%s, ", strArray[i]);
    free(strArray); // Free up the dynamically allocated array.
    return 0;
}

我想这就是你要找的。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int stringCompare(const void* p1, const void* p2)
{
   char** lhs = (char**)p1;
   char** rhs = (char**)p2;
   return strcmp(*lhs, *rhs);
}
int main()
{
   char s1[] = {'d', 'o', 'g', '', 'g', 'h', 'o', 's', 't', '', 'r', 'e', 'a', 'p', 'e', 'r', ''};
   char* s2[] = {s1, s1+4, s1+10};
   qsort(s2, 3, sizeof(char*), stringCompare);
   printf("%sn", s2[0]);
   printf("%sn", s2[1]);
   printf("%sn", s2[2]);
};

下面是一个示例程序,您可以参考

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare (const char* a, const char* b)
{
  return strcmp(a, b);
}
int main(void) {
    char *ar[3] = {"dog", "cat", "pig"};
    int i;
    qsort(ar, 3, sizeof(char*), compare); // here 3 is the number of elements in array
    printf("Data after sortingn");
    for(i=0; i<3; i++)
        printf("%sn", ar[i]);
    return 0;
}

这里我已经在声明过程中初始化了数组,但是你也可以稍后初始化它

最新更新