【发布时间】: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 字符串集合的 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* 进行排序。没有悬空指针
【问题讨论】:
您需要在原始数组中每个字符串的开头创建一个 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;
}
【讨论】:
qsort() 无法做到这一点,即使使用自己的算法,我也不清楚您将如何做到这一点。
我想这就是你要找的。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]);
};
【讨论】:
stringCompare。你不能直接把strcmp传给qsort吗?
iostream 怎么了?
strcmp,因为它使用char*,而qsort需要void*。布莱赫。
下面是一个示例程序,您可以参考
#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