2013-04-03 42 views
2

我用strncmp()函數得到了段錯誤11。我知道錯誤在哪裏,但不知道是什麼原因造成的。 這是我想解決的。我輸入一個包含大量單詞的txt文件。然後,我需要計算每個單詞的頻率,然後對單詞進行排序。最後,輸出排序詞與他們的頻率。因此,因爲它是一個C程序,我使用鏈表來存儲單詞和頻率。將單詞添加到鏈接列表並計算每個單詞的頻率都可以很好地工作。這個錯誤發生在我的快速排序中,我用它來排序單詞。 我的快速排序:strncmp()給我的快速排序c編程中的分段錯誤11

struct node *quick_sort(struct node *head, int l, int r){ 
    int i, j; 
    int jval; 
    int pivot; 
    int min; 
    char* test1; 
    char* test2; 
    i = l + 1; 
    if (l + 1 < r) { 
     test1 = get_char(head, l); 
     pivot = get_freq(head, l); 
     for (j = l + 1; j <= r; j++) { 
      jval = get_freq(head, j); 
      test2 = get_char(head, j); 
      printf("test 1: %s test 2: %s\n",test1,test2); 
      min = strlen(test1) < strlen(test2) ? strlen(test1) : strlen(test2); 
      printf("Length 1 :%ld Length 2: %ld Max is: %d\n",strlen(test1),strlen(test2), min); 

        // HERE is where the bug is 
      if (strncmp(test2,test1,min)<0 && jval != -1) {   
       swap(head, i, j); 
       i++; 
      } 
     } 
     swap(head, i - 1, l); 
     quick_sort(head, l, i); 
     quick_sort(head, i, r); 
    } 

    return head; 
} 

和其他相關功能:

int get_freq(struct node *head, int l){ 
    while(head && l) { 
     head = head->next; 
     l--; 
    } 
    if (head != NULL) 
     return head->freq; 
    else 
     return -1; 
} 

void swap(struct node *head, int i, int j){ 
    struct node *tmp = head; 
    int tmpival; 
    int tmpjval; 
    char* tmpiStr; 
    char* tmpjStr; 

    int ti = i; 
    while(tmp && i) { 
     i--; 
     tmp = tmp->next; 
    } 
    tmpival = tmp->freq; 
    tmpiStr = tmp->str; 
    tmp = head; 
    while(tmp && j) { 
     j--; 
     tmp = tmp->next; 
    } 
    tmpjval = tmp->freq; 
    tmpjStr = tmp->str; 
    tmp->freq = tmpival; 
    tmp->str = tmpiStr; 
    tmp = head; 
    i = ti; 
    while(tmp && i) { 
     i--; 
     tmp = tmp->next; 
    } 
    tmp->freq = tmpjval; 
    tmp->str = tmpjStr; 
} 

char* get_char(struct node *head, int l){ 
    char* res; 
    while(head && l) { 
     head = head->next; 
     l--; 
    } 
    if (head != NULL){ 
     char * arr = head->str; 
     return arr; 
    } 
    else 
     return res; 
} 

如果我更改STRNCMP(分鐘數),有時程序工作。我不知道什麼是錯的。 在此先感謝。

+0

你的get_char有一個char * res,它永遠不會被分配。此外,在同一個函數中,頭可能會變爲空,所以你會返回未定義的char * res –

+0

我可以在快速排序算法本身中發現一個即時問題。你沒有繞過遞歸的樞軸槽。它是實際*在*正確的地方的一個項目。你的分區應該圍繞它,但不包括它。 (注意:這假定算法本身甚至是正確的,我還沒有證實)。 – WhozCraig

回答

1

你從來沒有分配給get_char函數聲明的變量在此行

char* res; 

Segmentation fault 11錯誤一般是獲取調用當程序訪問還沒有分配的內存。在你的情況下,你可能試圖比較一個字符串和內存中的某個隨機位置。

+0

引入該狀態的罪魁禍首(應該固定的)是'j <= r;',從我所看到的應該是'j str:NULL)'並且完全拋出局部變量'res'。這不是必需的。 – WhozCraig

+0

換句話說。 'get_char()'的原因甚至達到了返回不確定指針的原因,因爲j控制循環超過了上限。 get_char()函數本身可以通過在while循環前進後全部拋出'res'變量並僅僅返回(head?head-> str:NULL)'來「固定」(鬆散的措辭選擇)。 – WhozCraig