我知道还有其他这样的问题,但是他们不能解决这个问题。
我正在尝试按其长度(降序)对字符串数组进行排序,并且我一直在尝试使用qsort
,因为这是建议的,但每个解决方案对我都不起作用。我相信原因是因为在所有使用qsort
的例子中他们都有一个数组;
char *arrayOfStrings...
但我的数组就是这样开始的
char **arrayOfStrings;
这是因为我正在动态地将字符串添加到数组中,但无论哪种方式,我都无法按顺序对qsort
进行排序。
参考代码:
int numberOfStrings = 0;
int numberOfStringsTwo = 0;
int totalNoStrings = 0;
scanf("%d", &numberOfStrings);
totalNoStrings += numberOfStrings;
char **inputArray = malloc(numberOfStrings * sizeof(char*));
for (int i = 0; i < numberOfStrings; i++) {
char input[100];
scanf("%s", input);
inputArray[i] = (char *)malloc((strlen(input) + 1));
strcpy(inputArray[i], input);
}
scanf("%d", &numberOfStringsTwo);
totalNoStrings += numberOfStringsTwo;
inputArray = realloc(inputArray, totalNoStrings * sizeof(char*));
for (int j = numberOfStrings; j < totalNoStrings; j++) {
char input[100];
scanf("%s", input);
inputArray[j] = (char *)malloc((strlen(input) + 1));
strcpy(inputArray[j], input);
}
qsort(inputArray, totalNoStrings, sizeof(char *), compareStrings);
size_t z;
for (z = 0; z < totalNoStrings; z++) {
printf("%s\n", inputArray[z]);
}
和
int compareStrings(const void *one, const void *two) {
const char *iOne = (const char*)one;
const char *iTwo = (const char*)two;
return strcmp(iOne, iTwo);
}
答案 0 :(得分:3)
compareStringLens()
函数不正确:它接收指向字符串指针的指针,你错过了代码中的一个间接级别,在指针的地址上调用strlen
具有未定义的行为。
这是一个比较函数,它按每个长度的长度和字典顺序对字符串进行排序:
int compareStrings(const void *one, const void *two) {
const char *iOne = *(const char * const *)one;
const char *iTwo = *(const char * const *)two;
size_t len1 = strlen(iOne);
size_t len2 = strlen(iTwo);
if (len1 > len2)
return -1;
if (len2 > len1)
return +1;
return strcmp(iOne, iTwo);
}