- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想对声明如下的字符串数组进行排序:
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
)并且它会起作用。
char**
大小写所需的大小?是的。您需要将它单独保存在一个变量中。您不能应用 sizeof
并从指针变量获取分配的内存大小。
如前所述,其他所有内容(比较器函数等)都将相同,只是现在您必须跟踪分配了多少并将其传递给 qsort
。您已经使用 4
的硬编码值分配了内存量。创建一个变量 const int size = 4
,然后保留它并相应地使用它。
长话短说 - 问题在于获取您想要排序的元素数量的大小。
关于c - 如何对字符**进行qsort?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48669339/
我是一名优秀的程序员,十分优秀!