使用qsort()c将此指针排序为char;

时间:2014-03-25 18:48:08

标签: c sorting qsort

我有一个指向char的指针,带有一组c-strings

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

我正在使用来自c库的qsort()方法O想要按升序排序 但我很喜欢如何通过字符串而不是字符来缩短它。

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

3 个答案:

答案 0 :(得分:2)

您需要在原始数组中的每个字符串的开头创建一个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 = "dog\0ghost\0reaper\0cat\0";

    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;
}

答案 1 :(得分:0)

以下是您可以参考的示例程序

#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 sorting\n");
    for(i=0; i<3; i++)
        printf("%s\n", ar[i]);
    return 0;
}

这里我在声明期间初始化了数组,但你也可以在以后初始化它。

答案 2 :(得分: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', '\0', 'g', 'h', 'o', 's', 't', '\0', 'r', 'e', 'a', 'p', 'e', 'r', '\0'};
   char* s2[] = {s1, s1+4, s1+10};

   qsort(s2, 3, sizeof(char*), stringCompare);
   printf("%s\n", s2[0]);
   printf("%s\n", s2[1]);
   printf("%s\n", s2[2]);
};