2014-02-09 64 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,但我做了綠色檢查! –