gpt4 book ai didi

c - 如何对字符进行排序**?

转载 作者:行者123 更新时间:2023-11-30 19:54:15 25 4
gpt4 key购买 nike

我有一个字符串数组。不幸的是,字符串数组中每个字符串的大小不是恒定的,所以我不能这样做:

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/

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