- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个字符串数组。不幸的是,字符串数组中每个字符串的大小不是恒定的,所以我不能这样做:
qsort(fileList, noOfFiles, sizeof(*fileList), compare);
并创建一个自定义比较函数。有什么替代方案吗?
fileList 是文件名列表。声明为:char **fileList;
我不能这样做的原因是因为 qsort 有点盲函数。 为了找到下一个元素,它只是跳过所述(第三个参数)内存单元。盲目地。如果使用可变长度字符串,则会导致随机行为。因为 qsort 无法识别字符串的起始和结束内存位置。
qsort 可用于 char *array[100]。
这是许多人要求的有错误的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void *string1, const void *string2){
char *a = (char*)(string1);
char *b = (char*)(string2);
printf("comparing %s AND %s\n", a, b);
return strcasecmp(a,b);
}
void sortListName(char **fileList, int noOfFiles){
printf("Sorting\n");
qsort(fileList, noOfFiles, sizeof(char*), compare);
return;
}
最佳答案
这取决于您的结构在内存中的布局方式:
如果您有 char **sort_this
,如下所示:
| char * | char * | char *|...
然后您可以使用 qsort 轻松对其进行排序。您有一个 char * 数组需要排序。该数组的长度是元素的数量,元素的宽度是 sizeof(char *)。您的自定义比较函数也非常简单:它是 strcmp 的包装器(您需要一个包装器,因为您将传递 char * 的地址而不是 char *)。
所以
int compare (void *lhs, void *rhs)
{
return strcmp(*(char **)lhs, *(char **)rhs)
}
但是,如果您在内存中放置了一个char *sort this
,如下所示:
"This string is long\0", "short\0", "medium length\0", ...
这样每个字符串都是连续的,那么您就必须编写自己的排序例程。但是移动字符串将是一场噩梦(交换相邻的字符串就可以了,所以我会选择冒泡排序,它也很容易编码并且在已经排序的列表上运行良好)。
但更好的想法是将数组重新排列为指向 char * 的指针并使用上述方法。
关于c - 如何对字符进行排序**?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18392589/
我是一名优秀的程序员,十分优秀!