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

时间:2014-02-09 01:04:22

标签: c

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

数组现在有一堆字符,例如 - “\ 0The \ 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);

我的比较功能

int rot13cmp (const void* c, const void* d)
{
    const char* a = (const char*)c;
    const char* b = (const char*)d;
    if (a[0] == '\0' && b[0] == '\t')
    {
        return -1;
    }
    else if (a[0] == '\t' && b[0] == '\0')
    {
        return 1;
    }
    int k = 0;
    for (;;k++)
    {
        if (a[k] == '\n' && b[k] != '\n')
            return -1;
        if (a[k] != '\n' && b[k] == '\n')
            return 1;
        if (a[k] == '\n' && b[k] == '\n')
            return 0;
        int one = (int)a[k];
        int two = (int)b[k];
        int difference = a[k] - b[k];
        if (difference != 0)
            return difference;
    }
}

1 个答案:

答案 0 :(得分:1)

您的比较功能不正确。如果要排序的序列是一系列指针,那么传递给比较的地址是 指针的地址;不是指向指针。

替换这个:

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;

或根据需要简化。你的其他功能应该可以工作(至少和你写的一样好,我从来没有检查过它的准确性,只是说onetwo都没有使用,应该删除,你的功能如果字符串相同,则应该有一个最外层return 0;以避免未定义的结果。