Can';t按Ctrl+;D达到EOF

Can';t按Ctrl+;D达到EOF,c,arrays,sorting,pointers,mergesort,C,Arrays,Sorting,Pointers,Mergesort,嗨,我是C语言的新手,所以我仍然对一些事情感到困惑,但是我要去那里。我正在尝试实现mergesort,我认为我已经正确地实现了它 当我编译并运行程序时,它会等待我给它输入。没关系,我给你5 4 3 2 1。然后我按下Ctrl+D,什么也没发生。它在终端的开头显示^D,但没有到达文件的结尾,并将我的排序数组吐出。不太清楚为什么会这样?我试着用打印行调试它,但似乎不知道为什么。这可能与scanf有关吗?谢谢 #include <stdio.h> #include <stdlib.h

嗨,我是C语言的新手,所以我仍然对一些事情感到困惑,但是我要去那里。我正在尝试实现mergesort,我认为我已经正确地实现了它

当我编译并运行程序时,它会等待我给它输入。没关系,我给你5 4 3 2 1。然后我按下Ctrl+D,什么也没发生。它在终端的开头显示^D,但没有到达文件的结尾,并将我的排序数组吐出。不太清楚为什么会这样?我试着用打印行调试它,但似乎不知道为什么。这可能与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;
}
#包括
#包括
#包括
#定义数组_MAX 30000
无效合并(int*a,int*w,int-length){
int i=0;
int j=(长度/2);
int k=0;
而((i=长度/2){
对于(;j
这不是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

while((i
由于
a[j]
始终为false,因此它将无限循环。
您的合并排序算法也不正确。有关更多详细信息,您可以查看的示例代码。

尝试按
CTRL+Z
它只是说已停止。所以也许我的代码有点不对劲,但我不知道它是什么。你在用哪个操作系统?错误是“filename.exe已停止工作”之类的吗?我正在使用带有Unix提示的macosx。我有一种感觉,这与我的代码有关,因为我以前制作的排序程序在我按下ctrl D键后吐出了排序后的数组。屏幕截图显示了发生了什么。注意,我按下Ctrl D,但什么也没发生,所以我按下control C
while ((i < length/2) && (j < length)){
        if (a[i] < a[j]){
                w[k] = a[i];
                i++;
                k++;
        }
        else {
                w[k] = a[j];
                j++;
                k++;
        }
}