我用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(分鐘數),有時程序工作。我不知道什麼是錯的。 在此先感謝。
你的get_char有一個char * res,它永遠不會被分配。此外,在同一個函數中,頭可能會變爲空,所以你會返回未定義的char * res –
我可以在快速排序算法本身中發現一個即時問題。你沒有繞過遞歸的樞軸槽。它是實際*在*正確的地方的一個項目。你的分區應該圍繞它,但不包括它。 (注意:這假定算法本身甚至是正確的,我還沒有證實)。 – WhozCraig