【发布时间】:2017-02-28 21:44:16
【问题描述】:
我知道还有其他类似的问题,但它们不起作用,因此提出了这个问题。
我正在尝试按字符串的长度(降序)对字符串数组进行排序,并且我一直在尝试使用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);
}
【问题讨论】:
-
上面的代码有什么问题?你的测试数据是什么样的,你期望什么结果,你得到什么结果? “这是我的代码,为我调试”并没有得到你太多的同情。
-
您的
compareStrings函数不会根据长度进行比较。它比较字符串。另外,您是否在调试器中单步执行了此操作? -
“它不起作用”是什么意思?它不编译吗?输入时会崩溃吗?它会给出不正确的输出吗?你必须给我们的不仅仅是“它不起作用”。我们在这里帮助您找到并解决问题,而不是为您考虑所有问题。
-
如果您想根据“长度”进行排序,那么为什么 compareStrings 会调用 strcmp?您应该根据它们的长度进行比较,即 strlen(iOne)
-
@KyloR 一个很好的例子,说明为什么了解你不编写的代码在使用之前是如何工作的。并不意味着你什么都知道,但至少知道它做什么。幸运的是,在这种情况下,这是一个简单的修复。