【问题标题】:sorting this pointer to char using qsort() c;使用 qsort() c 将此指针排序为 char;
【发布时间】:2014-03-25 18:48:08
【问题描述】:

我有这个指向带有 c 字符串集合的 char 的指针

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

我正在使用 c 库中的qsort() 方法 O 想按升序对其进行排序 但我很困惑如何用字符串而不是字符来缩短它。

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

【问题讨论】:

    标签: c sorting qsort


    【解决方案1】:

    您需要在原始数组中每个字符串的开头创建一个 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;
    }
    

    【讨论】:

    • 我有一个 char 指针,它指向原始指针字符串的开头,但我需要对原始 char 指针而不是新 char* 进行排序,并且仍然对新 char* 进行排序跨度>
    • @user3444777:如果我理解你的话,你想就地对你的空终止字符串的 char 数组进行排序。 qsort() 无法做到这一点,即使使用自己的算法,我也不清楚您将如何做到这一点。
    • @user3444777 您有一块内存,其中分配了一组字符串。我向您建议的是创建一个新的 char* 数组(即 char** 与 char*[] 相同)并将每个字符串的开头地址复制到这个新数组中。这不会修改原始内存块,只是指向它。然后可以对这个新的指向字符串的指针数组进行排序。现在,新的指针数组将重新排列以匹配您想要的排序顺序。
    【解决方案2】:

    我想这就是你要找的。​​p>

    #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]);
    };
    

    【讨论】:

    • 这是 NickC 答案的拼写版本。我不知道你为什么需要stringCompare。你不能直接把strcmp传给qsort吗?
    • 这是一道 C 题。 iostream 怎么了?
    • 啊,你不能直接传递strcmp,因为它使用char*,而qsort需要void*。布莱赫。
    • @Fred 如果我尝试这样做,orinal 数组会改变其 nemory 位置吗?
    • @FredLarson 感谢您指出 C 问题部分。我已经更新了我的答案。
    【解决方案3】:

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

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

    这里我已经在声明的时候初始化了数组,你也可以稍后再初始化。

    【讨论】:

    • 你应该使用sizeof (char *)而不是4
    猜你喜欢
    • 1970-01-01
    • 2018-02-18
    • 2015-12-13
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 2015-03-31
    相关资源
    最近更新 更多