gpt4 book ai didi

c - qsort() 在数组结束前停止排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:43:58 24 4
gpt4 key购买 nike

我有一个包含整数的文件。

我将这些值逐行读取到数组中。我正在尝试对每一行进行快速排序。在数组值完全停止打印之前,排序似乎是成功的。

我引用了:one websiteanother website 作为指导,因为我觉得这个问题与我设置 size_t n_len = sizeof((*array)/sizeof(array)); 不正确有关。

以下仅为相关代码:

int int_cmp(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}

while ((p = fgets(line, MAX_LINE_LEN, fp)) != NULL) {

p += strspn(p, " \t\n");
if (*p == '#' || *p == '\0') {

continue;
}

for (count = 0; *p != '\0'; ) {
if (isdigit((unsigned char)*p)) {
array[count++] = strtol(p, &p, 10);
} else {

p += strcspn(p, " \t\n");
}

p += strspn(p, " \t\n");
}

size_t n_len = sizeof((*array)/sizeof(array));
qsort(array, n_len, sizeof(int), int_cmp);

int n;
for (n = 0; n < n_len; n++)
printf("sorted array:%d\n ", array[n]);
}

这是输出:

sorted array:1
sorted array:2
sorted array:3
sorted array:4

sorted array:14
sorted array:14
sorted array:48
sorted array:62

sorted array:1
sorted array:3
sorted array:5
sorted array:7

sorted array:123
sorted array:456
sorted array:789
sorted array:1234

sorted array:34
sorted array:34
sorted array:34
sorted array:34

sorted array:1

sorted array:34
sorted array:34
sorted array:34

sorted array:1
sorted array:2
sorted array:2
sorted array:2

输出应该是:

sorted array:1
sorted array:2
sorted array:3
sorted array:4
sorted array:4
sorted array:5
sorted array:5
sorted array:5
sorted array:6

sorted array:14
sorted array:14
sorted array:48
sorted array:62

sorted array:1
sorted array:3
sorted array:5
sorted array:7
sorted array:9

sorted array:123
sorted array:456
sorted array:789
sorted array:1234
sorted array:5678

sorted array:34
sorted array:34
sorted array:34
sorted array:34

sorted array:1
sorted array:1
sorted array:1
sorted array:2
sorted array:2
sorted array:2
sorted array:2
sorted array:2
sorted array:3
sorted array:3
sorted array:4
sorted array:4
sorted array:4
sorted array:5
sorted array:5
sorted array:6
sorted array:7
sorted array:7
sorted array:7

最佳答案

数组长度的表达式应该是 sizeof(array)/sizeof(*array),而不是相反,而且 sizeof((*array) 中的括号不正确/sizeof(array)).

但是在您的代码中,您不应该对整个 数组进行排序,而只是对存储从该行解析的数字的初始部分进行排序。使用这个:

    qsort(array, count, sizeof(int), int_cmp);
printf("sorted array:");
for (int n = 0; n < count; n++) {
printf(" %d", array[n]);
}
printf("\n");

另请注意,您的 int_cmp 函数对于大值不正确:

int int_cmp(const void *a, const void *b) {
return *(int*)a - *(int*)b; // this may overflow
}

如果您比较 INT_MIN1,您将返回 INT_MIN - 1,它会调用未定义的行为并且很可能具有不正确的正值.

改用这个函数:

int int_cmp(const void *a, const void *b) {
int na = *(int*)a, nb = *(int*)b;
return (na < nb) - (nb < na);
}

关于c - qsort() 在数组结束前停止排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34968831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com