注意:这是家庭作业
我需要对字符串进行排序,我不允许更改此赋值的方法标题。
我已按如下方式填写方法(使用适当的比较器):
void sortString(const char* input, char* output) {
strcpy(output,input);
qsort(output, strlen(output)+sizeof(char), sizeof(char),comparator);
*output++ = '\0';
printf("%s\n",output); //prints correct output
}
如果我在结尾打印输出,我会看到我的期望。
在for循环中的main函数内部调用该方法:
char* key = malloc(strlen(words[i]) + sizeof(char));
sortString(words[i], key);
printf("key = %s\n", key); //key is blank
我不明白如何让key
获得输出值。根据我的理解,我需要通过引用传递,这将需要sortString来获取char** output
所以我可以传入&key
但不幸的是我无法更改方法头..还有另一种方法可以完成这是我不知道的?
答案 0 :(得分:3)
您的排序会导致未定义的行为。 (除非您传递的字符串有两个尾随空字符,这是不太可能的。如果您的比较器首先排序较大的字符,那么您也不会有问题。)
问题是我们有一块内存中包含这些字节:
{'h', 'e', 'l', 'l', 'o', '\0')
您对qsort的调用将导致:
{'\0', 'e', 'h', 'l', 'l', 'o'}
然后递增输出指针,然后打印{'e', 'h', 'l', 'l', 'o'}
,其中未终止。这是未定义的行为。
此外,此致电话key
指向{'\0', 'e', 'h', 'l', 'l', 'o'}
。由于output
是局部变量,因此不会执行输出指针的增量。
因此,当您尝试打印key
时,该字符串的第一个字符是空字符,这意味着它会打印空字符串。
void sortString(const char* input, char* output) {
strcpy(output, input);
qsort(output, strlen(output), sizeof(char), comparator);
}
然后打电话给我们,我们会这样做:
int main() {
const char * words[] = {
"hello",
};
char *key = malloc(strlen(words[0]) + 1);
sortString(words[0], key);
printf("%s -> %s\n", words[0], key);
}
qsort(words[0], &key)
?如果您要char **
为sortString()
分配内存,则只需要通过指针(dest
)传递指针。
答案 1 :(得分:0)
另一种方式是output
指向一个足以容纳整个输入字符串的缓冲区。然后,您可以将排序的字符串复制到该缓冲区中。看起来这就是你已经在做的事情。