我在c
中有这个代码const char * array[] = {
"1",
"2",
"helloworld",
"worldhello",
"3",
"zzzzzzzzzz",
"Zzzzzzzzzz",
"zzzzzzzzzZ",
};
/* n_array is the number of elements in the array. */
#define n_array sizeof(array)/sizeof(const char *)
/* Compare the strings. */
static int compare (const void * a, const void * b)
{
/* The pointers point to offsets into "array", so we need to
dereference them to get at the strings. */
return strcmp (*(const char **) a, *(const char **) b);
}
int main ()
{
int i;
qsort (array, n_array, sizeof (const char *), compare);
for (i = 0; i < 50000; i++) {
printf ("%d: %s.\n", i, array[i]);
}
return 0;
}
我希望输出变得像这样
helloworld
worldhello
Zzzzzzzzzz
zzzzzzzzzz
zzzzzzzzzZ
我如何修改我的代码以获得输出
答案 0 :(得分:1)
有两个错误:
a)在compare
中大量取消引用指针,实际上要简单得多:
static int compare (const void * a, const void * b) {
return strcmp (a, b);
}
b)您的输出循环,严重到50000?
for (i = 0; i < n_array; i++) {
printf ("%d: %s\n", i, array[i]);
}
摆脱&#34; 1&#34;,&#34; 2&#34;,&#34; 3&#34;是另一种练习。
答案 1 :(得分:0)
As&#39; Z&#39;小于&#39; h,它将被排序为第一个。
您当然可以使用stricmp
(或strcmpi
),但现在其中包含Z或z的字符串将按任意顺序排序。
然后有字符串&#34; 1&#34;,&#34; 2&#34;,&#34; 3&#34;并且你无法删除它们(实际上你可以,但不能排序)。
所以你的愿望无法实现。