对字符串进行排序并进行设置

时间:2014-07-11 03:57:06

标签: c pointers

注意:这是家庭作业

我需要对字符串进行排序,我不允许更改此赋值的方法标题。

我已按如下方式填写方法(使用适当的比较器):

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但不幸的是我无法更改方法头..还有另一种方法可以完成这是我不知道的?

2 个答案:

答案 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指向一个足以容纳整个输入字符串的缓冲区。然后,您可以将排序的字符串复制到该缓冲区中。看起来这就是你已经在做的事情。