qsort() 在数组结束前停止排序
qsort() stopped sorting before array's end
我有一个包含整数的文件。
我将这些值逐行读取到数组中。我正在尝试对每一行进行快速排序。排序似乎成功,直到数组值完全停止打印。
我参考了:one website and another 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 == '[=10=]') {
continue;
}
for (count = 0; *p != '[=10=]'; ) {
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_MIN
和 1
,您 return INT_MIN - 1
会调用未定义的行为并且很可能具有不正确的正值。
改为使用此函数:
int int_cmp(const void *a, const void *b) {
int na = *(int*)a, nb = *(int*)b;
return (na < nb) - (nb < na);
}
聆听 BLUEPIXY 在 qsort 调用中将 "n_len" 参数替换为 "count"。
qsort() 函数将数组中的元素数作为第二个参数。
只需稍微更改您的代码,它就会起作用:
size_t n_len =sizeof(array)/sizeof(int);
qsort(array, n_len, sizeof(int), int_cmp);
int n;
for (n=0; n<n_len; n++)
printf ("sorted array:%d\n ", array[n]);
int int_cmp (const void * a, const void * b){
return ( *(int*)a - *(int*)b );
}
这将产生所需的 answer.But 我希望您知道 'array' 是 'int' 类型。
我有一个包含整数的文件。
我将这些值逐行读取到数组中。我正在尝试对每一行进行快速排序。排序似乎成功,直到数组值完全停止打印。
我参考了:one website and another 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 == '[=10=]') {
continue;
}
for (count = 0; *p != '[=10=]'; ) {
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_MIN
和 1
,您 return INT_MIN - 1
会调用未定义的行为并且很可能具有不正确的正值。
改为使用此函数:
int int_cmp(const void *a, const void *b) {
int na = *(int*)a, nb = *(int*)b;
return (na < nb) - (nb < na);
}
聆听 BLUEPIXY 在 qsort 调用中将 "n_len" 参数替换为 "count"。
qsort() 函数将数组中的元素数作为第二个参数。 只需稍微更改您的代码,它就会起作用:
size_t n_len =sizeof(array)/sizeof(int);
qsort(array, n_len, sizeof(int), int_cmp);
int n;
for (n=0; n<n_len; n++)
printf ("sorted array:%d\n ", array[n]);
int int_cmp (const void * a, const void * b){
return ( *(int*)a - *(int*)b );
}
这将产生所需的 answer.But 我希望您知道 'array' 是 'int' 类型。