2017-08-31 94 views
2

我有指针数组以字符串:c char字符的qsort为字符串

char *TAB[3] = { "dafafa", "alfkasf", "bafgr" }; 

我想在每个这些字符串的字符进行排序。

我比较功能:

int cmp(const void *a, const void *b) 
{ 
    return *(char *)a - *(char *)b; 
} 

,并同时对其中的一个尝试快速排序:

qsort(TAB[0], 6, sizeof(char), cmp); 

程序不起作用。 经过很多努力,我发现问题的原因是在提供TAB[0]qsort()

任何人都可以解释为什么它不工作,以及如何解决?

+6

C中的字符串是*只读*。尝试修改它们会导致[*未定义行为*](https://en.wikipedia.org/wiki/Undefined_behavior)。 –

+0

“我想对每个字符串中的字符进行排序。” - >在给定源字符串写入的情况下,您希望将该排序字符串放在哪里,_string literal_,是_undefined behavior_? – chux

回答

4

如果您想对每个字符串中的字符进行排序,您必须确保的第一件事是您的字符串可以写入。就目前来看,你的字符串是只读的,所以你不能将它们的字符排序,而不把它们的内容复制到允许写入的内存中。

接下来的事情是你需要一个循环。由于您要分别对每个字符串进行排序,因此您需要遍历数组,并在每个项目上调用qsort。初始项目为TAB[i],长度为strlen(TAB[i])。你的cmp功能将起作用。

+0

你怎么知道这些字符串是只读的?你能告诉我可以解决这个问题的代码示例吗? 我检查过后,声明'char tab [] =“dafafa”'而不是'char * tab =“dafafa”'它工作。那里有什么区别? –

+3

@PiotrWitkoś所有字符串文字都是只读的,因为您不允许更改其内容。 'char tab [] =“dafafa”'是不同的,因为你用一个字符串文字初始化一个字符数组。这个数组变得可写。原始代码中的TAB [3]是一个指针数组,所以它非常像'char * tab =“dafafa”'重复三次。你可以查看[这里](https://ideone.com/1eqKyG),看看如何正确复制字符串。 – dasblinkenlight

+0

我在考试中有一个问题,要对字符串'TAB [100]''中的每个字符串中的字符进行排序。你如何声明它以避免复制内容? –