2014-02-09 269 views
2

我正在使用的程序使用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

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

替换此:

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;如果字符串相同,则避免未定义的结果)。

+0

谢谢。这解决了我的大部分问题!如果有其他事情发生,我会回来。 –

+0

Np您在本网站上表示感谢,并将其标记为“该”解决方案。看到上面的答案旁边的箭头和绿色检查。 – WhozCraig

+0

哈哈我没有足够的声望来upvote,但我做了绿色检查! –