gpt4 book ai didi

c - 如何对字符**进行qsort?

转载 作者:太空宇宙 更新时间:2023-11-04 02:27:44 24 4
gpt4 key购买 nike

我想对声明如下的字符串数组进行排序:

char** s;
s = calloc(4, sizeof(char *));
s[0] = "Banana";
s[1] = "Apple";
s[2] = "Grape";
s[3] = "Strawberry";

为此我使用了 qsort 函数:

size_t len = sizeof(s) / sizeof(char *);
qsort(s, len, sizeof(char *), cmp);

其中 cmp 看起来像这样:

int cmp(const void* s1, const void* s2)
{
const char** a = (const char**) s1;
const char** b = (const char**) s2;
return strcmp(*a, *b);
}

但是,对于这段代码,没有任何内容被排序,输出的顺序与它在数组中的顺序相同。问题是,我用另一种方式检查了它,我将数组声明为(qsort 和 cmp 保持不变):

char* s[] = {"Banana", "Apple", "Grape", "Strawberry"};

并且输出得到了完美的排序。我有点理解是因为,第一个方法是double(pointer to pointer)指针,第二个是指向数组的指针,但它们的工作原理是一样的。关于如何对 char** 进行排序的任何想法?提前致谢

最佳答案

此代码是正确的代码。char* s[] = {"Banana", "Apple", "Grape", "Strawberry"}; 是正确的,并且会按照您的预期运行是。

明确声明 - 您对 sizeof 的使用是有效的,不会有问题。 当用作 sizeof 的操作数时,数组不会在此处衰减

char ** 确实是正确的。每个元素的地址被传递给 cmp 函数。

问题是:-

char** s = calloc ... 的情况下,使用 sizeof 是错误的,因为它是一个包含分配 block 地址的指针。您无法知道分配给它的内存量。因此,当您将代码与 char**s = calloc .. 一起使用时,指定数组的大小(不使用 sizeof)并且它会起作用。

有没有办法让 len 成为 char** 大小写所需的大小?

是的。您需要将它单独保存在一个变量中。您不能应用 sizeof 并从指针变量获取分配的内存大小。

如何让两者都起作用?

如前所述,其他所有内容(比较器函数等)都将相同,只是现在您必须跟踪分配了多少并将其传递给 qsort。您已经使用 4 的硬编码值分配了内存量。创建一个变量 const int size = 4,然后保留它并相应地使用它。

长话短说 - 问题在于获取您想要排序的元素数量的大小。

关于c - 如何对字符**进行qsort?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48669339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com