我在C语言中编写了此函数:

int process_list(node_t *head){
    char c;
    node_t *prev = head; /* Define pointer to point the previous node */
    head->next = NULL;
    head->data = getchar(); /* Insert the first char to the head's data property */
    if ( head->data == EOF ) {
        return head;
    }

    while ( (c = getchar()) != EOF ) {
        node_t *current = (node_t *) malloc(sizeof(node_t));
        current->data = c;
        current->next = NULL;
        prev->next = current;
        prev = current;
    }

    print_list(head);

    return 1;
}


而且我想检查程序,所以为了模拟EOF,我被告知我需要使用^ D(ctrl + D)。但是,当我使用它时,它只是停止了程序,并且没有看到print_list应该显示的输入。结果是:
c - C:Ctl + D退出程序-LMLPHP

但是所需的结果(我通过在'\ n'中替换EOF来模拟这一点,只需按Enter):c - C:Ctl + D退出程序-LMLPHP

函数print_list

void print_list(node_t *head) {
    node_t * current = head;

    printf("The input is:\n");

    while ( current != NULL ) {
        printf("%c", current->data);
        current = current->next;
    }

    printf("\n");

    free_list(head);
}


知道为什么EOF终止程序吗?
提前致谢!

最佳答案

while ( (c = getchar()) != EOF )循环是错误的,因为c的类型为char

getchar()返回类型为int的值,该值可以使用unsigned char表示,也可以使用EOF表示,这是实现定义的值,通常不能存储在char中。

c的类型更改为int,而不是char

以下注释特定于Unix。

为了按预期工作,用户必须在一行的开头(程序的第一个字符输入,或在换行符之后)输入CTRL-D。

如果在一行字符后按CTRL-D,则需要键入TWICE。第一个CTRL-D将导致在不关闭stdout的情况下读取前面的字符,而下一个getchar()的调用将等待另一个字符。到那时,第二个CTRL-D将关闭stdout,通常导致getchar()返回EOF(并且输入CTRL-D以外的内容仅表示继续读取)。

在您的情况下,由于您仅输入一个CTRL-D而不是在行的开头,因此您正在运行程序的环境(例如调试器)要么超时,要么检测CTRL-D,并导致程序终止。但是,这只是一种可能性-您没有提供足够的信息来确认这一点。

除了使用直接读取击键的技术以外,没有其他解决方法-使用标准C无法实现。类似地,在标准C中也没有任何手段可以迫使人类用户进行操作。

09-05 06:51
查看更多