我有一个指向char的指针,带有一组c-strings
d|o|g|\0|g|h|o|s|t|\0|r|e|a|p|e|r|\0
我正在使用来自c库的qsort()
方法O想要按升序排序
但我很喜欢如何通过字符串而不是字符来缩短它。
我有一个指向原始指针开头的字符指针,但我需要的是对原始字符指针进行排序而不是新的字符*并仍然对新的字符*进行排序。没有悬挂指针
答案 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]);
};