C 将指针数组设置为指针,指向另一个数组中的指针

C 将指针数组设置为指针,指向另一个数组中的指针,c,C,我正在使用的程序使用qsort和我自己的比较函数对通过标准输入读取的一组单词进行排序。我将每个字符放入一个指向字符的指针数组中,如下所示 该数组现在有一组字符,例如-“\0\n\0brown\n\0fox\n\0is\n\0lazy\n” 我试图创建另一个指向指针的指针数组,其中新数组的每个元素都指向每个单词的第一个字母(本例中为空字符)。因此,元素0指向第一个\0,元素1指向下一个\0。我不确定我是否有一个小的语法错误,或者我是否有错误的想法,但是有些东西一直出错,因为输出的顺序从来都不正确。

我正在使用的程序使用qsort和我自己的比较函数对通过标准输入读取的一组单词进行排序。我将每个字符放入一个指向字符的指针数组中,如下所示

该数组现在有一组字符,例如-“\0\n\0brown\n\0fox\n\0is\n\0lazy\n”

我试图创建另一个指向指针的指针数组,其中新数组的每个元素都指向每个单词的第一个字母(本例中为空字符)。因此,元素0指向第一个\0,元素1指向下一个\0。我不确定我是否有一个小的语法错误,或者我是否有错误的想法,但是有些东西一直出错,因为输出的顺序从来都不正确。代码如下:

int buffersize = 2048;
int count = 0;
char* p = (char*) malloc(sizeof(char) * buffersize);
int c;
do{
    c = getchar();
    p[count++] = (char)c;
    if (count == buffersize)
    {
        p = (char*) realloc(p, buffersize * 2);
        buffersize *= 2;
    }
}while (c != EOF);
p[count-1] = '\n';
int i = 0;
int a = 1;
char ** pp = (char**) malloc(sizeof(char*) * count);
pp[0] = &p[0];
for (i; i < count; i++)
{
    if (p[i] == '\n')
    {
        while (p[i+1] == '\n')
        {i++;}
        if ( i != (count-1) )
        {
            pp[a++] = &p[i+1];
        }
    }
}
qsort (pp, (a-1), sizeof(char*), compare);

您的比较函数不正确。如果被排序的序列是指针序列,那么传递给比较的地址是指针的地址;指针中没有地址

替换此项:

const char* a = (const char*)c;
const char* b = (const char*)d;
为此:

const char * const* lhs = c;
const char * const* rhs = d;
const char* a = *lhs;
const char* b = *rhs;

或者根据需要简化。函数的其余部分应该可以工作(至少和您编写的一样好,我从来没有检查过它的准确性,只是说
one
two
都没有使用,应该删除,并且您的函数应该有一个最外层的
返回0;
,以避免字符串相同时出现未定义的结果)。

谢谢。这解决了我的大部分问题!如果还有什么事情发生,我会回来的。你可以在这个网站上通过投票或将答案标记为“解决方案”来表示感谢。看到上面答案旁边的箭头和绿色复选框。哈哈,我没有足够的声望去投票,但是我做了绿色复选@戴维斯谢比:不用担心。对于与此特定问题无关的问题(希望已解决),只需发布一个新问题。确保包括问题所在、复制步骤、复制的代码,以及您期望的与看到的内容。这是获得坚实的眼睛和良好答案的最佳途径。你越是努力先自己解决问题,就越有可能有人来帮忙。相信我。
const char * const* lhs = c;
const char * const* rhs = d;
const char* a = *lhs;
const char* b = *rhs;