C qsort()在数组';终点

C qsort()在数组';终点,c,algorithm,sorting,quicksort,C,Algorithm,Sorting,Quicksort,我有一个整数文件 我逐行将这些值读入数组。我正试着对每一行进行快速排序。排序似乎成功,直到数组值完全停止打印 我引用了:作为指导,因为我觉得这个问题与我设置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_

我有一个整数文件

我逐行将这些值读入数组。我正试着对每一行进行快速排序。排序似乎成功,直到数组值完全停止打印

我引用了:作为指导,因为我觉得这个问题与我设置
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: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_MIN
1
,则返回调用未定义行为的
INT_MIN-1
,并且很可能具有不正确的正值

请改用此功能:

int int_cmp(const void *a, const void *b) {
    int na = *(int*)a, nb = *(int*)b;
    return (na < nb) - (nb < na);
}
int\u cmp(常数无效*a,常数无效*b){
int na=*(int*)a,nb=*(int*)b;
返回(na
数组长度的表达式应该是
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_MIN
1
,则返回调用未定义行为的
INT_MIN-1
,并且很可能具有不正确的正值

请改用此功能:

int int_cmp(const void *a, const void *b) {
    int na = *(int*)a, nb = *(int*)b;
    return (na < nb) - (nb < na);
}
int\u cmp(常数无效*a,常数无效*b){
int na=*(int*)a,nb=*(int*)b;
返回(na
侦听BLUEPIXY将qsort调用中的“n_len”参数替换为“count”。

侦听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 );
}
size\t n\u len=sizeof(数组)/sizeof(int);
qsort(数组,n_len,sizeof(int),int_cmp);
int n;
对于(n=0;n,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 );
}
size\t n\u len=sizeof(数组)/sizeof(int);
qsort(数组,n_len,sizeof(int),int_cmp);
int n;

对于(n=0;n
size\t n\u len=sizeof((*array)/sizeof(array));
这可能不会给你期望的大小。使用
count
而不是
n\u len
@BLUEPIXY谢谢!解决了它。如果你想把它作为答案,我会接受它。(
size\t n\u len=sizeof((*array)/sizeof(array))
这可能无法提供您期望的大小。请使用
count
而不是
n_len
@BLUEPIXY谢谢!解决了它。如果您想将其作为答案,我将接受它。(:另一个用户通过将n_len替换为count解决了此问题。但是,感谢您提供有关可能溢出的说明。我将更改此设置。我同意通常
int_cmp
函数不安全;它将处理示例数据。您对
sizeof()的看法是正确的。)
表达式错误,但使用的值应为
count
(行上的整数数)而不是数组的最大大小。@Justin_Finland:您可以单击答案分数下面的灰色复选标记将其标记为已接受吗?另一个用户通过将n_len替换为count解决了此问题。但是,感谢您提供有关可能溢出的说明。我将更改此设置。我同意通常
int_cmp
函数为not safe;它可以处理示例数据。关于
sizeof()
表达式错误的说法是正确的,但是使用的值应该是
count
(行上的整数数)而不是数组的最大大小。@Justin_Finland:您能单击答案分数下面的灰色复选标记将其标记为已接受吗?我这样做了。谢谢。(:我这样做了。谢谢。(: