无法按 Ctrl + D 到达 EOF

Can't press Ctrl + D to reach EOF

您好,我是 C 语言的新手,所以仍然对一些事情感到困惑,但是到了那里。我正在尝试实施合并排序,我认为我已经正确实施了它。

当我编译并 运行 程序时,它等待我给它输入。没关系,我给它 5 4 3 2 1。然后我去按 Ctrl + D,没有任何反应。它在终端的开头显示 ^D 但没有到达文件末尾并将我吐出我的排序数组。不太清楚为什么会这样?我试图用 printlines 调试它,但似乎无法弄清楚为什么。这可能与scanf有关吗?谢谢

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ARRAY_MAX 30000

void merge(int *a, int *w, int length){
    int i = 0;
    int j = (length/2);
    int k = 0;

    while ((i < length/2) && (j < length)){
            if (a[i] < a[j]){
                    w[k] = a[i];
                    i++;
                    k++;
            }
            else if (a[j] < a[j]){
                    w[k] = a[j];
                    j++;
                    k++;
            }
    }
    if (i >= length/2){
            for (; j < length; i++){
                    w[k] = a[j];
                    k++;
            }
    }
    else{
            for (; i < length/2; i++){
                    w[k] = a[i];
                    k++;
            }
    }
 }

/*mergesort, requires a workspace*/
void merge_sort(int *a, int *w, int length){

    int i;
    if (length < 2){
            return;
    }
    merge_sort(a, w, length/2);
    merge_sort(a+(length/2), w, (length-(length/2)));

    merge(a,w,length);

    /*copy workspace back to original array*/
    for (i=0; i < length; i++){
            a[i] = w[i];
    }
}

int main(void){
    int my_array[ARRAY_MAX];
    int workspace[ARRAY_MAX];
    clock_t start, end;
    int i;
    int count = 0;

    while ((count < ARRAY_MAX) && (1==scanf("%d", &my_array[count]))){
            count++;
    }

    printf("debug");
    start = clock();
    merge_sort(my_array, workspace, count);
    end = clock();

    for (i=0; i < count; i++){
            printf("%d\n", my_array[i]);
    }

    fprintf(stderr, "%d %f\n", count, (end-start)/(double)CLOCKS_PER_SEC);
    return EXIT_SUCCESS;
}

不是Ctrl+D不行的问题,是你的算法问题。请更改

while ((i < length/2) && (j < length)){
        if (a[i] < a[j]){
                w[k] = a[i];
                i++;
                k++;
        }
        else if (a[j] < a[j]){
                w[k] = a[j];
                j++;
                k++;
        }
}

while ((i < length/2) && (j < length)){
        if (a[i] < a[j]){
                w[k] = a[i];
                i++;
                k++;
        }
        else {
                w[k] = a[j];
                j++;
                k++;
        }
}

由于a[j] < a[j]总是假的,所以会无限循环。 而且您的合并排序算法也不正确。更详细的可以看merge_sort.

的示例代码